我有具有多对多关系的模型 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(??????????)
谢谢
最佳答案
http://guides.rubyonrails.org/association_basics.html#the-has-and-belongs-to-many-association
使用这种方法,您只有两个模型,没有中间模型。
请注意,数据库将有一个连接表,并且需要创建它的迁移。
它将有两个字段,每个字段都是对应模型/表的外键。
这是基本的方法。
与许多关联一样,实际的外键由 Rails Actvie Record 组件填充,该组件查看模型之间的关系并确定在键、额外记录等方面需要什么。这是配置的约定,也知道作为 rails 的“魔法”。小心复制模型/表键或记录(“偏离 rails ”)并让 rails 为您管理。
实现此目的的另一种方法是使用在中间包含连接模型的 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 - 调用单个数据点
python - 如何在对象上进行 str.replace?
ruby - 使用 ruby_gnuplot 在 Ruby 中制作动画 3d 散点图
sql-server - 在 SQL Server 中的数字字段上没有聚合的数据透视