Модель:
class Project < ActiveRecord::Base
has_many :user_roles
after_initialize :add_user_roles
def add_user_roles
UserRoles.all.each do |ur|
self.user_roles << ur unless self.user_roles.include?(ur)
end
end
end
Оператор, который находит проекты:
@projects = Project.includes(:user_roles)
Итак, как вы видите, я говорю, чтобы включить в запрос ассоциацию ролей пользователя.Тем не менее, я все еще вижу проблему n + 1 запросов: он находит роли один раз для каждого проекта.
Если я удаляю использование self.user_roles
из обратного вызова и просматриваю журналы, я вижу, что он находит проекты и их роли пользователей в 2 запросах - один для проектов и один для ролей, использующихproject_id in (1,2,3,4,5...,n)
.
Есть ли способ обойти это?
Позвольте мне немного уточнить: хотя я и хочу обойти свою конкретную ситуацию, если потребуется, я бы предпочел ответы, которые сосредоточены на том, как решить проблему в целом.Я способен написать kludge, чтобы получить данные в том состоянии, в котором я их хочу, без использования обратного вызова after_initialize и, следовательно, не сталкиваться с проблемой n + 1 запросов.Однако я бы предпочел не делать этого, поэтому я предпочитаю ответы на общую проблему, а не на моем конкретном примере.