Вручную создавать ассоциации, чтобы обойти ограничения загрузки с 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
    ...

Похоже, что mongoid не поддерживает сложную нетерпеливую загрузку начиная с версии 6. Можно ли вместо этого просто выполнить 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/

Спасибо за любую помощь, Кевин

1 ответ

Ответ, который я искал, был методом set_relation. Исходя из кода выше, решение:

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

set_relation принимает два аргумента: символ для отношения и массив или синглтон объектов.

Другие вопросы по тегам