2015-04-17 5 views
6

Мне нужно предварительно установить ассоциации модели со сложными условиями. NO, includes не работает для меня. Он генерирует неправильный SQL для моей задачи.Как установить область предварительной загрузки для Rails-ассоциаций :: Preloader?

я взгляну на ActiveRecord::Associations::Preloader и обнаружили, что он взять preload_scope аргумент:

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

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

Но я не могу найти ни одного примера использования. Что такое preload_scope в этом случае? И как я могу использовать его для фильтрации ассоциаций? Спасибо!

ответ

2

ActiveRecord не раскрывает это через #preloads по отношению: https://github.com/rails/rails/blob/0aefa97689d001ca9a98db76bbad1bbbb0e51c9c/activerecord/lib/active_record/relation.rb#L663 - как вы видите, передаются только параметры записей и ассоциаций.

Вы можете достичь в ActiveRecord внутренностей и вызвать Preloader непосредственно:

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

О, спасибо, это работает! Но почему это создает так много запросов? «Пользовательская нагрузка (12,1 мс) SELECT« пользователи ». * FROM« users »WHERE (created_at> '2015-01-01') И« пользователи ».« Cat »IN (52, 50, 51, 53) Пользовательская загрузка (1,2 мс) SELECT «пользователи». * FROM «users» WHERE (created_at> '2015-01-01') Пользовательская нагрузка (5.1ms) SELECT «users». * FROM «users» ' – Vladimir

+0

Можете ли вы опубликовать ваш код? –

+0

'users = Car.find (1) .users rows = users.to_a ActiveRecord :: Ассоциации :: Preloader.new.preload (rows,: действия, Struct.new (: values,: bind_values) .new ({where: "created_at> '2015-01-01'"}, [])) ' – Vladimir

 Смежные вопросы

  • Нет связанных вопросов^_^