2010-04-30 6 views
0

1) 사용자는 많은 원인을 가질 수 있으며 원인은 많은 사용자에게 속할 수 있습니다.이 유스 케이스의 테이블과 관계를 설정하는 가장 좋은 방법은 무엇입니까?

2) 사용자는 많은 캠페인을 가질 수 있으며 캠페인은 많은 사용자에게 속할 수 있습니다. 캠페인은 하나의 원인에 속합니다.

특정 사용자에게 원인이나 캠페인을 개별적으로 할당 할 수 있기를 원합니다. 따라서 사용자에게 특정 캠페인을 할당 할 수 있습니다. 또는 사용자에게 원인을 할당 할 수 있으며 원인의 모든 캠페인을 사용자와 연관시켜야합니다.

가능합니까? 관계가과 같이 단순화 할 수 있도록 그리고 나는 그것을 설정할 수 있습니다 :

User.causes = 사용자

User.campaigns에 속하는 모든 원인 =에 속한 모든 캠페인 사용자

답변

0

나는 다음과 같은 사용한다고 생각 원인 협회 또는 캠페인 협회를 통해 여부 :

class User < ActiveRecord::Base 
    has_and_belongs_to_many :causes 
    has_and_belongs_to_many :campaigns 
end 

class Cause < ActiveRecord::Base 
    has_and_belongs_to_many :users 
    has_many :campaigns 
end 

class Campaign < ActiveRecord::Base 
    has_and_belongs_to_many :users 
    belongs_to :cause 
end 
을 당신은 here에 대한 has_and_belongs_to_many 관계를 읽을 수 있습니다 당신은

User.causes 
User.campaigns 

Cause.campaing 
Cause.users 

Campaign.users 
Campaign.cause 

을 사용할 수 있습니다

이 방법 here에 대한 has_onehere에 대한 belongs_to. ]

편집 :

"나는 여전히 사용자의 원인 또는 개별 캠페인에서 캠페인이 될 에 User.campaigns를해야이 당신이 원하는 경우

은 알려주세요 사용자와 연결됨 "

모든 캠페인을 반환하는 사용자 모델에 대한 메소드입니다. 다음과 같은 내용이 있습니다.

def all_campaigns 
    self.campaigns + self.causes.collect{ |c| c.campaigns } 
end 
+0

나는 그것이 가깝다고 생각한다. 그러나 원인은 많은 캠페인을 가질 수 있습니다. 그리고 나는 사용자의 원인이나 사용자와 관련된 개별 캠페인의 캠페인이되기 위해 여전히 User.campaigns가 필요합니다 ... –

+0

내 편집 된 답변보기 편집] –

+0

편집 된 솔루션이 효과가 있다고 생각합니다. 나는 중복 된 것을 없애기 위해 .flatten.uniq을 반환 된 컬렉션에 추가했으며, 나는 잘 할 수 있다고 생각합니다. 정말 도움을 주셔서 감사합니다 :) - has_many : 대신 has_and_belongs_to_many를 사용했습니다. –

1

이렇게하면됩니다.

class User < ActiveRecord::Base 
    has_many :causes, :through => :cause_users 
    has_many :campaigns, :through => :campaign_users 
    # other model stuff 

class Cause < ActiveRecord::Base 
    has_many :users, :through => :cause_users 
    has-many :campaigns 
    # other model stuff 

class Campaign < ActiveRecord::Base 
    belongs_to :cause 
    has_many :users, :through => :campaign_users 
    # other model stuff 

class CampaignUser < ActiveRecord::Base 
    belongs_to :campaign 
    belongs_to :user 
    # other model stuff 

class CauseUser < ActiveRecord::Base 
    belongs_to :cause 
    belongs_to :user 
    # other model stuff 

has_many : 통해 당신이 이러한 조인 각각에 대한 새로운 모델을 만들어야합니다 : 도시 한 바와 같이, campaign_users 및 cause_users을하지만 has_and_belongs_to_many보다 나중에 더 많은 기능을 제공합니다.

campaign_users 및 : cause_users보다 나은 이름을 사용하는 것이 좋습니다. 관계가 더 의미가 있습니다.

+0

왜 has_many를 사용하면 왜 has_and_belongs_to_many "보다 더 많은 기능을 제공합니까? –

+0

그것이 원래 생각한 것이지만 구멍이 있습니다. 원인이 사용자 (캠페인이 있음)에 속한다고 가정 해 보겠습니다. 사용자를 통해 그 원인을 통해 캠페인을 검사하려면 어떻게해야합니까? User.causes.campaigns와 유사하지만 User.campaigns를 호출하고 특정 사용자의 cause_users 아래 campaign_users 및 캠페인에서 두 캠페인을 모두 찾고 싶습니다. 말이 돼? –

+0

has_and_belongs_to_many (HABTM)에서는 관계에 대한 추가 정보를 제공하지 않습니다. 예를 들어 특정 캠페인 (예 : 한 캠페인의 리더, 다른 캠페인의 리더)에 사용자 역할을 할당하려는 경우 HABTM을 사용하여이를 수행 할 수 없습니다. –

0

다음과 같이 할 수 있습니다. has_many : 조인 모델을 사용하는 사용자와 캠페인 간의 연결을 통해, 그리고 다른 조인 모델을 사용하는 사용자와 원인간에도 연결할 수 있습니다. 원인 모델에서 has_many : campaigns 연관을 만들고 캠페인 모델에 belongs_to : cause를 넣을 수 있습니다.

하지만 User.campaigns.orders 또는 User.order.campaigns로 모든 사용자 캠페인이나 원인을 가져올 수는 없습니다. User.campaigns 컬렉션이나 User.causes를 반복하여 Campaign.cause 또는 Cause.capaigns를 가져와야합니다. 또는 조인과 조인을 사용하여 조인의 정보를 필터링하는 사용자 지정 SQL 쿼리를 만들 수도 있습니다.