Ruby on rails 手动构造关联以绕过mongoid的即时加载限制?

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似乎不支持复杂的即

假设我有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似乎不支持复杂的即时加载。是否可以只运行我的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接受两个参数,即关系的符号和对象的数组或单例