我有模型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(??????????)
由于
答案 0 :(得分:0)
http://guides.rubyonrails.org/association_basics.html#the-has-and-belongs-to-many-association
通过这种方法,您只需要两个模型而没有中间模型
请注意,数据库 将具有连接表,并且需要进行迁移才能创建连接表。
它将有两个字段,每个字段都是相应型号/表的外键
这是基本的方式。
与许多关联一样,实际的外键由Rails Actvie Record组件填充,该组件查看模型之间的关系并计算出在键,额外记录等方面需要什么。这是约定优于配置,也知道作为铁轨的“魔力”。小心复制模型/表格键或记录(“离开轨道”)并让rails为您管理。
实现此目的的另一种方法是使用包含中间连接模型的has_many_through
这在此详述:
http://guides.rubyonrails.org/association_basics.html#the-has-many-through-association
使用此方法,您可以使用中间连接表,并可以向其中添加其他字段。我发现在应用程序生命中“稍后”通常需要在连接表中添加布尔字段或时间戳(例如,您可以轻松选择“今天的连接”,从而从头开始使用has_many_through,甚至如果不是严格需要的话,以后很容易添加字段而不重写关系。