0

假设我有 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、B 和 C,并手动覆盖关联。像这样的东西:

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):

https://mrbrdo.wordpress.com/2013/09/25/manually-preloading-associations-in-rails-using-custom-scopessql/

感谢您的帮助,凯文

4

1 回答 1

0

我正在寻找的答案是 set_relation 方法。从上面的代码,解决方案是:

bs.values.each do |k,v|
    v.a = a
    v.set_relation(:cs, cs[k])
end

set_relation 有两个参数,关系的符号和对象的数组或单例。

于 2017-03-07T00:28:59.857 回答