2015-04-17 14 views
6

Modelin ilişkilerini karmaşık koşullarla önceden yüklemem gerekiyor. NO, includes benim için çalışmıyor. Görevim için yanlış SQL üretir.Rails Associations :: Preloader için önyükleme kapsamı nasıl ayarlanır?

Ben ActiveRecord::Associations::Preloader için bir göz atın ve o bir preload_scope argüman aldığını bulmak:

http://apidock.com/rails/v4.2.1/ActiveRecord/Associations/Preloader/preload

def preload(records, associations, preload_scope = nil) 
    # ... 
end 

Ama bunu kullanarak herhangi bir örnek bulamıyorum. Bu durumda preload_scope nedir? Ve dernekleri filtrelemek için nasıl kullanabilirim? Teşekkürler!

cevap

2

ActiveRecord ilişkiye #preloads ile bu maruz değildir: https://github.com/rails/rails/blob/0aefa97689d001ca9a98db76bbad1bbbb0e51c9c/activerecord/lib/active_record/relation.rb#L663 - Yalnızca kayıtları ve dernekler parametrelerin geçirilmesi görebilirsiniz.

Sen ActiveRecord iç yapıları içine ulaşmak ve doğrudan Preloader çağırabilirsiniz:

rows = Projects.all.to_a 
ActiveRecord::Associations::Preloader.new.preload(rows, :current_task, Struct.new(:values, :bind_values).new({where: "active"}, [])) 
+0

Teşekkürler çalışıyor! Ama neden bu kadar çok sorgu yaratıyor? 'Kullanıcı Yükleme (12.1ms) SELECT" users ". *" Users "FROM (created_at> '2015-01-01') VE" users "." Cat "IN (52, 50, 51, 53) Kullanıcı Yükleme (1.2 msn) SELECT "kullananlar". * "Kullanıcılardan" WHERE (created_at> '2015-01-01') Kullanıcı Yükleme (5.1ms) SELECT "users". * FROM "users" ' – Vladimir

+0

Mesaj gönderebilir misiniz? senin kodun? –

+0

'users = Car.find (1) .users satır = users.to_a ActiveRecord :: İlişkilendirmeler :: Preloader.new.preload (satırlar,: etkinlikler, Struct.new (: değerler,: bind_values) .new ({nerede: "created_at> '2015-01-01'"}, [])) – Vladimir

İlgili konular