0

假設我有3種型號,A,B和C:手動構建關聯以避開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 
    ... 

看來mongoid不支持複雜的預先加載爲版本6。是否有可能,而不是僅僅運行我的3個查詢,抓住所有作爲,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):

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

感謝您的幫助, 凱文

回答

0

我的答案尋找是set_relation方法。從上面的代碼,該解決方案是:

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

set_relation採用兩個參數,對於關係和對象的陣列或單符號。