【问题标题】:How to do multiple many to many relationships between the same two tables如何在相同的两个表之间建立多个多对多关系
【发布时间】:2011-02-26 09:08:56
【问题描述】:

我有一个俱乐部模型,我想在其中对会议和会员这两个实体进行建模。

实际上,这些实体之间存在两种多对多关系,因为对于任何会议,成员都可以是发言人或访客。现在我是一个面向对象的思想家,所以通常只创建两个类,每个类里面只有两个数组,但是 rails 让我在这里思考更多以数据为中心,所以我意识到我需要打破这些 M2M与我已经完成的连接表 Speakers 和 Guest 的关系,但现在我无法描述模型中的关系。

两个连接表模型都有“belongs_to :meeting”和“belongs_to :member”,我认为应该足够了。

不过,我不确定会议和成员模型。

每个人都有“has_many:guests”和“has_many:speakers”,但我不确定我是否也想去: has_many :members, :through => :guests has_many :members, :through => :speakers

但我怀疑这就像宣布两个“成员”会发生冲突。

我也想过: has_many :guests, :through => :guests has_many :speakers, :through => :speakers

这有意义吗? ActiveRecord 怎么知道他们实际上是成员?

我发现了很多多态 m2m 关系和 1 个表引用自身的 m2m 关系的示例,但是没有好的示例可以帮助我模拟这种情况,即两个单独的表具有两个不同的 m2m 关系。

有人有什么建议吗?

【问题讨论】:

    标签: ruby-on-rails activerecord many-to-many ruby-on-rails-3


    【解决方案1】:

    您需要选择不同的关联名称,然后指定模型:

    class Meeting
      has_many :guests
      has_many :speakers
      has_many :guest_members, :through => :guests, :source => 'Member'
      has_many :speaker_members, :through => :speakers, :source => 'Member'
    end
    

    【讨论】:

    • 感谢您的回复。我试过了,虽然 :through 不支持 :class_name ,但使用 :source 可以。现在我只需要处理表单、控制器、路由器等。我不确定我是想使用成员控制器,还是访客和扬声器控制器。我现在的表单正在寻找一个成员控制器,所以我将首先尝试......
    • 哦,对了,对不起。我将为未来的读者编辑答案。对于它的价值,我可能会像 has_many :members, :through => :registrationshas_many :speakers, :through => :speaker_registrations, :source => 'Member' 那样设计它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-28
    • 2015-03-07
    • 1970-01-01
    • 1970-01-01
    • 2018-03-06
    • 2017-06-10
    • 1970-01-01
    相关资源
    最近更新 更多