2010-04-30 72 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 

這樣,您就可以使用

User.causes 
User.campaigns 

Cause.campaing 
Cause.users 

Campaign.users 
Campaign.cause 

您可以閱讀herehas_and_belongs_to_many關係,herehas_oneherebelongs_to

讓我知道這是你想要的東西:]

編輯:

「我仍然需要User.campaigns到 是從用戶的原因或 單個廣告系列活動與一個 用戶「

你可以有一個方法返回所有廣告系列的用戶模型。這樣的事情:

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

我認爲它很接近。原因可以有許多活動。我仍然需要User.campaigns來自用戶的原因或與用戶相關的單個活動的廣告系列... – 2010-04-30 16:55:15

+0

請參閱我編輯的答案:] – 2010-04-30 17:27:28

+0

我認爲您的編輯解決方案將起作用。我將.flatten.uniq添加到返回的集合中以去除重複項,我認爲我很好。我非常感謝幫助:) - 我確實使用has_many:而不是has_and_belongs_to_many。 – 2010-04-30 17:56:06

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」'提供更多的功能? – 2010-04-30 17:01:16

+0

這就是我最初的想法,但它有一些漏洞。假設某個原因屬於某個用戶(包含廣告系列),那麼您將如何通過該用戶檢查這些廣告系列的廣告系列?這將像User.causes.campaigns類似,但我希望能夠調用User.campaigns,並從特定用戶的campaign_users和位於cause_users下的廣告系列中找到這兩個廣告系列。那有意義嗎? – 2010-04-30 17:12:56

+0

has_and_belongs_to_many(HABTM)不允許您提供有關該關係的其他信息。例如,如果您要爲特定廣告系列分配用戶角色(例如,某個廣告系列的負責人,另一個祕書長),那麼您將無法使用HABTM來完成此任務。 – 2010-04-30 21:25:10

0

您可以:has_many:通過用戶和使用連接模型的活動之間的關聯,以及用戶之間的關聯,以及使用另一個連接模型的原因。您可以在原因模型中創建:has_many:campaigns關聯,並在廣告系列模型中添加:belongs_to:cause。

但是您將無法通過User.campaigns.orders或User.order.campaigns獲取所有用戶的廣告系列或原因。您應該對User.campaigns集合或User.causes進行迭代,獲取Campaign.cause或Cause.capaigns。甚至可以使用連接和條件來過濾連接中的信息,從而實現自定義SQL查詢。

相關問題