0

1)一个用户可以有多个原因,一个原因可以属于多个用户。

2)一个用户可以有多个活动,活动可以属于多个用户。运动属于一个原因。

我希望能够将原因或活动单独分配给给定的用户。因此,可以为用户分配特定的活动。或者,可以为用户分配一个原因,然后该原因的所有活动都应与用户相关联。

那可能吗?我可以设置它,以便可以像这样简化关系:

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

User.campaigns = 属于用户的所有活动,无论是通过原因关联还是活动关联

4

3 回答 3

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 更好的名称,这样关系更有意义。

于 2010-04-30T16:43:38.240 回答
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关系、此处关于has_one此处关于的内容belongs_to

让我知道这是否是您想要的:]

编辑:

“我仍然需要 User.campaigns 是来自用户原因的活动或与用户相关联的个人活动”

您可以在 users 模型上有一个返回所有活动的方法。像这样的东西:

def all_campaigns
   self.campaigns + self.causes.collect{ |c| c.campaigns }
end
于 2010-04-30T16:42:22.970 回答
0

您可以使用连接模型在用户和活动之间建立 :has_many :through 关联,也可以使用另一个连接模型在用户和原因之间建立关联。您可以在原因模型中创建一个 :has_many :campaigns 关联,在活动模型中放置一个 :belongs_to :cause 。

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

于 2010-04-30T16:55:58.443 回答