如何在Rails中加入多对多表

时间:2013-06-26 11:14:53

标签: ruby-on-rails join

我有模型A和模型B与多对多的关系,因此我有一个第三个表(比如说C),每个表都有信息。我正在使用MySql。

所以我的模型是这样的:

class a < ActiveRecord::Base
    has_many :c
end

class b < ActiveRecord::Base
    has_many :c
end

class c < ActiveRecord::Base
    belongs_to :a
    belongs_to :b
end

当然,c包含a_id&amp;列的列。出价。 这是现有的模型。

现在我需要一个新的模型类,其中包括a_id&amp; b_id(由于复杂的原因,它需要&amp; b而不是c,因为它需要&amp; b的所有现有和未来的C条目,例如)。

class d < ActiveRecord::Base
    ...
    belongs_to :a
    belongs_to :b
end

我的问题是关于如何创建一个也加入c的查询(这是为了允许在迭代结果和访问c时过滤并减少SQL查询的数量。)

如何执行此类查询?
我想我知道如何开始,但不知道如何结束它。

D.where(<something>).includes(:a).includes(:b).joins(??????????)

由于

1 个答案:

答案 0 :(得分:0)

有两种方法可以做到这一点:


has_many_through:

http://guides.rubyonrails.org/association_basics.html#the-has-and-belongs-to-many-association

通过这种方法,您只需要两个模型而没有中间模型 请注意,数据库 具有连接表,并且需要进行迁移才能创建连接表。
它将有两个字段,每个字段都是相应型号/表的外键 这是基本的方式。 与许多关联一样,实际的外键由Rails Actvie Record组件填充,该组件查看模型之间的关系并计算出在键,额外记录等方面需要什么。这是约定优于配置,也知道作为铁轨的“魔力”。小心复制模型/表格键或记录(“离开轨道”)并让rails为您管理。


has_and_belongs_to_many

实现此目的的另一种方法是使用包含中间连接模型的has_many_through 这在此详述:
http://guides.rubyonrails.org/association_basics.html#the-has-many-through-association
使用此方法,您可以使用中间连接表,并可以向其中添加其他字段。我发现在应用程序生命中“稍后”通常需要在连接表中添加布尔字段或时间戳(例如,您可以轻松选择“今天的连接”,从而从头开始使用has_many_through,甚至如果不是严格需要的话,以后很容易添加字段而不重写关系。