1)用戶可能有許多原因,原因可能屬於許多用戶。爲此用例設置我的表和關係的最佳方式是什麼?
2)用戶可以有許多活動和活動可以屬於許多用戶。活動屬於一個原因。
我希望能夠將原因或活動分配給給定的用戶。因此可以爲用戶分配特定的廣告系列。或者可以爲用戶分配原因,然後將該原因的所有活動與用戶關聯。
這可能嗎?而我能設置它,這樣的關係可以簡化像這樣:
User.causes =屬於用戶
User.campaigns各種原因=屬於所有活動用戶無論是通過事業協會或運動協會
1)用戶可能有許多原因,原因可能屬於許多用戶。爲此用例設置我的表和關係的最佳方式是什麼?
2)用戶可以有許多活動和活動可以屬於許多用戶。活動屬於一個原因。
我希望能夠將原因或活動分配給給定的用戶。因此可以爲用戶分配特定的廣告系列。或者可以爲用戶分配原因,然後將該原因的所有活動與用戶關聯。
這可能嗎?而我能設置它,這樣的關係可以簡化像這樣:
User.causes =屬於用戶
User.campaigns各種原因=屬於所有活動用戶無論是通過事業協會或運動協會
我相信你應該使用下列內容:
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
您可以閱讀here約has_and_belongs_to_many
關係,here約has_one
和here約belongs_to
。
讓我知道這是你想要的東西:]
編輯:
「我仍然需要User.campaigns到 是從用戶的原因或 單個廣告系列活動與一個 用戶「
你可以有一個方法返回所有廣告系列的用戶模型。這樣的事情:
def all_campaigns
self.campaigns + self.causes.collect{ |c| c.campaigns }
end
這應該工作。
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,因此這種關係更有意義。
爲什麼使用has_many'「比has_and_belongs_to_many」'提供更多的功能? – 2010-04-30 17:01:16
這就是我最初的想法,但它有一些漏洞。假設某個原因屬於某個用戶(包含廣告系列),那麼您將如何通過該用戶檢查這些廣告系列的廣告系列?這將像User.causes.campaigns類似,但我希望能夠調用User.campaigns,並從特定用戶的campaign_users和位於cause_users下的廣告系列中找到這兩個廣告系列。那有意義嗎? – 2010-04-30 17:12:56
has_and_belongs_to_many(HABTM)不允許您提供有關該關係的其他信息。例如,如果您要爲特定廣告系列分配用戶角色(例如,某個廣告系列的負責人,另一個祕書長),那麼您將無法使用HABTM來完成此任務。 – 2010-04-30 21:25:10
您可以:has_many:通過用戶和使用連接模型的活動之間的關聯,以及用戶之間的關聯,以及使用另一個連接模型的原因。您可以在原因模型中創建:has_many:campaigns關聯,並在廣告系列模型中添加:belongs_to:cause。
但是您將無法通過User.campaigns.orders或User.order.campaigns獲取所有用戶的廣告系列或原因。您應該對User.campaigns集合或User.causes進行迭代,獲取Campaign.cause或Cause.capaigns。甚至可以使用連接和條件來過濾連接中的信息,從而實現自定義SQL查詢。
我認爲它很接近。原因可以有許多活動。我仍然需要User.campaigns來自用戶的原因或與用戶相關的單個活動的廣告系列... – 2010-04-30 16:55:15
請參閱我編輯的答案:] – 2010-04-30 17:27:28
我認爲您的編輯解決方案將起作用。我將.flatten.uniq添加到返回的集合中以去除重複項,我認爲我很好。我非常感謝幫助:) - 我確實使用has_many:而不是has_and_belongs_to_many。 – 2010-04-30 17:56:06