В моем методе контроллера для представления индекса у меня есть следующая строка.Почему метод where() запускает SQL-запросы после того, как все вложенные отношения загружены?
@students_instance = Student.includes(:memo_tests => {:memo_target => :memo_level})
Таким образом, для каждых Student
I нетерпеливых нагрузок всей необходимой информацией.
Позже в блоке .map
я вызываю метод .where()
в одном из соотношений, как показано ниже.
@all_students = @students_instance.map do |student|
...
last_pass = student.memo_tests.where(:result => true).last.created_at.utc
difference_in_weeks = ((last_pass.to_i - current_date.to_i)/1.week).round
...
end
Это приводит к одному запроса SQL для каждого student
. И так как у меня более 300 студентов, это приводит к очень медленным временам загрузки и более чем 300 + SQL-запросам.
Я прав, полагая, что это вызвано методом .where()
. Я думаю, это потому, что я проверил все остальное, и это две строки, которые вызывают все запросы.
Что еще более важно, есть ли лучший способ сделать это, который сводит эти запросы к одному запросу?
Итак, вы хотите получить последний пройденный memo_test для каждого ученика? –
Дело в том, что этот запрос будет довольно сложным, и я даже не уверен, что это можно сделать в ActiveRecord. Может быть, вам придется пойти на что-то вроде продолжения или написать sql самостоятельно –
Не совсем, у меня уже есть доступ к «memo_tests» каждого ученика без выполнения запроса. Я хочу запустить метод '.where', не используя SQL-запрос. – nonsequiter