Ruby on rails 如何在Rails中连接多对多表

Ruby on rails 如何在Rails中连接多对多表,ruby-on-rails,join,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 class a

我有多对多关系的模型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
class a
当然,c包含a_id和b_id的列。 这是现有的模式

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

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

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

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

有两种方法可以做到这一点:
通过以下方式进行了多次检查:

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


你和你属于很多人吗

另一个实现这一点的方法是使用HasuMangyION,其中包括中间的连接模型。 这里有详细说明:

使用这种方法,您有一个中间联接表,可以向其中添加其他字段。我发现,在应用程序生命周期中,“以后”通常希望向联接表中添加布尔字段或时间戳(例如,您可以轻松选择“todays joins”,因此从一开始就有很多个连接,即使不是严格需要,也可以使以后添加字段非常容易,而无需重新写入关系



您的问题没有什么问题。首先,我建议您理解include和join之间的区别(您可以在stackoverflow上找到).你写查询的方式显示了你对包含和连接的混淆。其次,根据你的问题,你如何应用C和D之间的连接,它们没有任何关系。要应用它们之间的连接,你需要它们之间的关系。谢谢,但我知道区别…我需要包含,因为我需要急切的加载和访问o A&B字段。我曾试图简化我们的真实模型,但可能会让你感到困惑,但我们确实有关系。无论如何,我最终还是编写了一个有点复杂的SQL连接来克服这个问题。你可以反向使用。
has_和_beside_to_many
没有中间模型,而
has_many:through
有中间模型。
D.where(<something>).includes(:a).includes(:b).joins(??????????)