음, 두 가지 모델 인 연락처 및 그룹이 있습니다. 이 두 사람은 분명히 자신 만의 테이블을 가질 것입니다 (레일스 규칙을 따르고 있다면 아마도 '연락처'와 '그룹'). 컨택은 여러 그룹에 속할 수 있고 그룹에는 많은 컨택이있을 수 있으므로 이러한 모델간에 다 대다 관계라는 것이 있습니다. 기본적으로 레일즈에서 이것을 구현하는 두 가지 방법이 있습니다 : has_and_belongs_to_many
또는 has_many :through
. 어느 것이 당신에게 가장 적합한지는 당신의 상황에 조금 의존 할 것입니다.
has_and_belongs_to_many
은 아마도 가장 저항이 적은 경로 일 것입니다.
# contact.rb
has_and_belongs_to_many :groups
# group.rb
has_and_belongs_to_many :contacts
을 ... 그리고 열 contact_id
및 group_id
와 'contacts_groups'라는 테이블을 만들고, 당신은 기본적으로 갈 수 있어요 : 당신은 너무처럼 모델에서 몇 라인을 넣어. 쉬워요.
한편, has_many :through
인 연결 모델을 사용하면 몇 가지 장점이 있습니다. 이 방식에서, 다른 모델, 말, GroupMembership을 만들고과 같이 모델을 설정 :
# contact.rb
has_many :group_memberships # this isn't strictly required, but I'd recommend it
has_many :groups, :through => :group_memberships
# group_membership.rb
has_many :groups
has_many :contacts
# group.rb
has_many :group_memberships # again, recommended but not required
has_many :contacts, :through => :group_memberships
이 당신이 수있는 추가 데이터를 저장할 수 있습니다 또한 같은 편리한 메소드의 대부분 has_and_belongs_to_many
로 제공하고, 그들이 그룹에 가입 한 날짜 나 그들이 추가 된 이유와 같은 협회에 대해 원합니다. 아직 그 중 하나가 없더라도 나중에 추가 할 수있는 가능성을 설명하는 것이 좋습니다. 또한 GroupMembership 리소스를 만들고 파괴하는 측면에서 모델링 할 수 있기 때문에 그룹에 연락처를 추가하고 제거하는 데 좀 더 RESTful 인 접근 방식을 사용할 수 있습니다.
전반적으로 RESTful 아키텍처를 더 많이 사용함에 따라 후자의 방식으로 기울어지는 경향이 있습니다. 반면에 REST에 대해 걱정하지 않고 회원 자격에 대한 추가 정보를 원하지 않는다고 확신하는 경우 has_and_belongs_to_many
은 더 간단하고 작동하기 위해 필요한 코드가 더 적을 것입니다. 차이점 및 구현 세부 정보에 대한 자세한 내용은 ActiveRecord Associations API docs을 참조하십시오.
내가 has_and_belongs_to_many에 볼 수있는 유일한 중단 객체에 속성으로 추가 할 조인 테이블에 필드를 정의하는 것입니다은 (실제로 당신이 진짜 원하는 대신 모델을 가입하는 것이 좋습니다 것) 협회를 통해 당겼다. 사실, 링크 된 API는 "다 - 대 - 다 관계를 구축하는 방법이 항상 단순하지는 않다"며 "관계 모델을 자체 엔티티로 사용해야하는 경우 has_many : through를 사용하십시오. has_and_belongs_to_many ... 당신은 관계 자체와 직접 일하지 않습니다. " 즉, 대부분의 경우 모델 조인에 의지합니다. –