1)一个用户可以有多个原因,一个原因可以属于多个用户。
2)一个用户可以有多个活动,活动可以属于多个用户。运动属于一个原因。
我希望能够将原因或活动单独分配给给定的用户。因此,可以为用户分配特定的活动。或者,可以为用户分配一个原因,然后该原因的所有活动都应与用户相关联。
那可能吗?我可以设置它,以便可以像这样简化关系:
User.causes = 属于用户的所有原因
User.campaigns = 属于用户的所有活动,无论是通过原因关联还是活动关联
1)一个用户可以有多个原因,一个原因可以属于多个用户。
2)一个用户可以有多个活动,活动可以属于多个用户。运动属于一个原因。
我希望能够将原因或活动单独分配给给定的用户。因此,可以为用户分配特定的活动。或者,可以为用户分配一个原因,然后该原因的所有活动都应与用户相关联。
那可能吗?我可以设置它,以便可以像这样简化关系:
User.causes = 属于用户的所有原因
User.campaigns = 属于用户的所有活动,无论是通过原因关联还是活动关联
这应该有效。
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 更好的名称,这样关系更有意义。
我相信你应该使用以下内容:
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
您可以使用连接模型在用户和活动之间建立 :has_many :through 关联,也可以使用另一个连接模型在用户和原因之间建立关联。您可以在原因模型中创建一个 :has_many :campaigns 关联,在活动模型中放置一个 :belongs_to :cause 。
但是您将无法通过 User.campaigns.orders 或 User.order.campaigns 获取所有用户活动或原因。您应该对 User.campaigns 集合或 User.causes 进行迭代,获取 Campaign.cause 或 Cause.capaigns。甚至可以进行自定义 SQL 查询,使用联接和条件来过滤联接中的信息。