Ruby on rails 手动构造关联以绕过mongoid的即时加载限制?
假设我有3个模型,A、B和C:Ruby on rails 手动构造关联以绕过mongoid的即时加载限制?,ruby-on-rails,mongoid,ruby-on-rails-5,eager-loading,mongoid6,Ruby On Rails,Mongoid,Ruby On Rails 5,Eager Loading,Mongoid6,假设我有3个模型,A、B和C: class A include Mongoid::Document has_many :bs ... class B include Mongoid::Document belongs_to :a has_many :cs ... class C include Mongoid::Document belongs_to :B ... 从版本6开始,mongoid似乎不支持复杂的即
class A
include Mongoid::Document
has_many :bs
...
class B
include Mongoid::Document
belongs_to :a
has_many :cs
...
class C
include Mongoid::Document
belongs_to :B
...
从版本6开始,mongoid似乎不支持复杂的即时加载。是否可以只运行我的3个查询来获取所有As、Bs和Cs,并手动覆盖关联。大概是这样的:
a = A.(#some criteria).first
bs = B.where(a_id: a.id).group_by{|x| x.id}
cs = C.where(:b_id.in => bs.values.collect{|x| x.id}).group_by{|x| x.b_id}
a.bs = bs
bs.values.each do |k,v|
v.a = a
v.cs = cs[k]
end
cs.each do |k,v|
v.b = bs[v.b_id]
end
这似乎工作得很好,但当您访问a.bs和b.cs等时,它会引发大量查询,因此显然在mongoid级别不起作用。有没有一种方法可以手动覆盖关联,这样我就可以运行查询并手动组装它们
基本上,我想用mongoid(和Rails 5)做一些与本文描述的类似的事情:
谢谢你的帮助,
凯文我一直在寻找的答案是集合关系法。根据上述代码,解决方案是:
bs.values.each do |k,v|
v.a = a
v.set_relation(:cs, cs[k])
end
set_relation接受两个参数,即关系的符号和对象的数组或单例