2009-10-21 4 views
2

막연한 제목에 대해 유감 스럽지만 한 줄에 넣기가 어렵습니다.Ruby on Rails에서 이것을 어떻게 구성해야합니까?

나는 연락처 정보가 가득한 데이터베이스를 가지고 있으며 데이터베이스에 저장 될 그룹으로 다른 연락처를 넣을 수 있기를 원합니다.

두 그룹, "동료"및 "이웃"이있을 수 있습니다. 모든 연락처 목록을보고 하나 이상의 그룹에 개별 연락처를 추가 할 수 있기를 원합니다.

어디에서 시작해야 할 지 혼란 스럽습니다. 구현 방법에 대한 기본 개요를 얻을 수 있습니까? 감사.

답변

2

음, 두 가지 모델 인 연락처 및 그룹이 있습니다. 이 두 사람은 분명히 자신 만의 테이블을 가질 것입니다 (레일스 규칙을 따르고 있다면 아마도 '연락처'와 '그룹'). 컨택은 여러 그룹에 속할 수 있고 그룹에는 많은 컨택이있을 수 있으므로 이러한 모델간에 다 대다 관계라는 것이 있습니다. 기본적으로 레일즈에서 이것을 구현하는 두 가지 방법이 있습니다 : 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_idgroup_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을 참조하십시오.

0

당신이 될 수있는 루비 레일에 데이터베이스를 구성 할 수 : 일반적인 생각 될 수

Contact (first_name:string, last_name:string, title:enum number:string, cell:string, notes:text, email:string) => many_many :groups (or has_many :groups, :through=> :contact_group) 
Contact_Group { group_id:integer, contact_id:integer } 
Group (name:string) => many_many :contacts) (or has_many :contacts, :through=> :contact_group) 

합니다. 또한 관계형 필드를 사용할 수도 있습니다.

0

당신은 has_and_belongs_to_many 접근 방식을 사용하고 싶지 않습니다. 더 이상 사용되지 않습니다. API를 읽고 join model/has_many : through 방식을 구현했는지 확인하십시오. API는 이것을 수행하는 방법을 알려주며 has_and_belongs_to_many가 나쁜 이유를 설명합니다.

http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html

+1

내가 has_and_belongs_to_many에 볼 수있는 유일한 중단 객체에 속성으로 추가 할 조인 테이블에 필드를 정의하는 것입니다은 (실제로 당신이 진짜 원하는 대신 모델을 가입하는 것이 좋습니다 것) 협회를 통해 당겼다. 사실, 링크 된 API는 "다 - 대 - 다 관계를 구축하는 방법이 항상 단순하지는 않다"며 "관계 모델을 자체 엔티티로 사용해야하는 경우 has_many : through를 사용하십시오. has_and_belongs_to_many ... 당신은 관계 자체와 직접 일하지 않습니다. " 즉, 대부분의 경우 모델 조인에 의지합니다. –

관련 문제