3

我有具有多对多关系的模型 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 的所有现有和未来 C 条目)。

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

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

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

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

谢谢

4

1 回答 1

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,甚至如果不是严格需要,那么以后添加字段非常容易,而无需重新编写关系。


于 2013-06-26T11:58:19.507 回答