【问题标题】:What is the best way to setup my tables and relationships for this use case?为此用例设置表和关系的最佳方法是什么?
【发布时间】:2010-04-30 16:28:22
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: ruby-on-rails ruby models relationships


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

    【讨论】:

    • 为什么使用 has_many "provides more functionality later on than has_and_belongs_to_many"
    • 这就是我最初的想法,但它有一些漏洞。假设一个原因属于一个用户(有活动),您将如何通过该用户检查活动?这将类似于 User.causes.campaigns 但我希望能够调用 User.campaigns 并找到来自特定用户的campaign_users 和cause_users 下的营销活动。这有意义吗?
    • has_and_belongs_to_many (HABTM) 不允许您获得有关关系的其他信息。例如,如果您要为特定活动分配用户角色(例如,一个活动的领导者,另一个活动的秘书),您将无法使用 HABTM 做到这一点。
    • @Dustin:这会与广告系列建立用户 has_many 关系,因此您可以直接从用户那里访问广告系列。
    【解决方案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
    

    您可以阅读here 了解has_and_belongs_to_many 关系,here 了解has_onehere 了解belongs_to

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

    编辑:

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

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

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

    【讨论】:

    • 我觉得差不多了。不过,一个事业可以有很多活动。而且我仍然需要 User.campaigns 是来自用户原因的活动或与用户相关联的个人活动......
    • 我认为您编辑的解决方案会起作用。我将 .flatten.uniq 添加到返回的集合中以消除重复项,我想我很高兴。我非常感谢您的帮助:) - 我确实使用了 has_many :through 而不是 has_and_belongs_to_many。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-11-23
      • 2016-11-23
      • 2018-07-08
      • 1970-01-01
      • 1970-01-01
      • 2011-03-25
      • 2014-03-18
      相关资源
      最近更新 更多