ruby-on-rails - 如何加入 Rails 中的多对多表

我有具有多对多关系的模型 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 和 b_id 的列。 这是现有的模型。

现在我需要一个新的模型类,其中包含 a_id 和 b_id(出于复杂的原因,它需要 a 和 b 而不是 c,因为它需要 a 和 b 的所有现有和 future 的 C 条目,例如)。

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

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

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

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

谢谢

最佳答案

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


有_many_through:

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

使用这种方法,您只有两个模型,没有中间模型。
请注意,数据库有一个连接表,并且需要创建它的迁移。
它将有两个字段,每个字段都是对应模型/表的外键。
这是基本的方法。 与许多关联一样,实际的外键由 Rails Actvie Record 组件填充,该组件查看模型之间的关系并确定在键、额外记录等方面需要什么。这是配置的约定,也知道作为 rails 的“魔法”。小心复制模型/表键或记录(“偏离 rails ”)并让 rails 为您管理。


has_and_belongs_to_many

​​>

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


https://stackoverflow.com/questions/17318517/

相关文章:

javascript - Xhr 上传事件.loaded 问题

sql-server - 对选择结果中的每一行执行 INSERT

xaml - Telerik RadMaskedNumericInput 掩码

python - MindWave Mobile - 调用单个数据点

r - 使用包命名空间在 R 中进行分层 cox 回归

python - 如何在对象上进行 str.replace?

ruby - 使用 ruby​​_gnuplot 在 Ruby 中制作动画 3d 散点图

sql-server - 在 SQL Server 中的数字字段上没有聚合的数据透视

ms-access - 如何在 vba(access) 中将变量设置为我的表单列表框之一?

css - 在相同高度缩放 float div