为此用例设置表和关系的最佳方法是什么?

时间:2010-04-30 16:28:23

标签: ruby-on-rails ruby models relationships

1)用户可能有多种原因,原因可能属于许多用户。

2)用户可以拥有多个广告系列,广告系列可以属于许多用户。广告系列属于一个原因。

我希望能够分别为给定用户分配原因或广告系列。因此,可以为用户分配特定的广告系列。或者可以为用户分配原因,然后该原因的所有活动都应该与用户相关联。

这可能吗?我可以进行设置,以便简化关系:

User.causes =属于用户的所有原因

User.campaigns =所有属于用户的广告系列,无论是通过原因关联还是广告系列关联

3 个答案:

答案 0 :(得分: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:through要求您为每个联接创建一个新模型:campaign_users和cause_users,如图所示,但它提供的功能比has_and_belongs_to_many更多。

我还建议使用比:campaign_users和:cause_users更好的名称,以便关系更有意义。

答案 1 :(得分: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

您可以阅读有关has_and_belongs_to_many关系的here,有关has_one的{​​{3}}和关于belongs_to的{​​{3}}。

如果这是你想要的,请告诉我:]

修改

  

“我仍然需要User.campaigns来   是来自用户原因的活动   与a相关的各个广告系列   用户“

您可以在用户模型上使用返回所有广告系列的方法。像这样:

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

答案 2 :(得分:0)

您可以使用连接模型通过用户和广告系列之间的关联,以及使用其他连接模型的用户和原因之间的关联来创建:has_many:您可以在原因模型中创建:has_many:campaign关联,在广告系列模型中添加:belongs_to:cause。

但是,您将无法通过User.campaigns.orders或User.order.campaigns获取所有用户广告系列或原因。您应该对User.campaigns集合或User.causes进行迭代,获取Campaign.cause或Cause.capaigns。甚至可以使用连接和条件来过滤连接中的信息,从而进行自定义SQL查询。