为此用例设置我的桌子和关系的最佳方法是什么?
-
02-10-2019 - |
题
1)用户可以有很多原因,原因可能属于许多用户。
2)用户可以拥有许多广告系列,并且广告系列可以属于许多用户。竞选活动属于一个原因。
我希望能够单独地为给定的用户分配原因或广告系列。因此可以为用户分配特定的广告系列。或者可以为用户分配一个原因,然后应与用户关联该原因的所有活动。
那可能吗?我可以设置它,以便可以像这样简化关系:
用户 =属于用户的所有原因
用户 =所有属于用户的广告系列,无论是通过因果协会还是广告系列协会
解决方案
我相信您应该使用以下内容:
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
.
让我知道这是否是您想要的:
编辑:
“我仍然需要用户。
您可以在用户模型上使用一个返回所有广告系列的方法。这样的事情:
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:通过要求您为每个连接创建一个新模型:竞选_users和cause_users,如所示,但比HAS_AND_AND_BELONGS_TO_MANY在以后提供的功能更多。
我还建议使用比:竞选_users和:casues_users更好的名称,使关系更有意义。
您可以制作:HAS_MANY:通过使用JOIN模型以及用户和使用另一个Join模型的用户和原因之间的广告系列之间的关联。您可以在原因模型中制作一个:has_many:广告系列协会,将一个:属于:属于活动模型中的原因。
但是您将无法通过用户来获取所有用户广告系列或原因。您应该对用户进行迭代。甚至可以使用连接和条件进行自定义SQL查询,以过滤连接中的信息。
不隶属于 StackOverflow