2013-05-08 4 views
0

Следующий код работает, но для меня очень много предложений SQL;Удаление избыточных запросов с использованием активной записи

User.includes([:profile,:roles]).select("id, email, created_at, confirmed_at, countries.name").find_in_batches do |users| 
     users.map{|u| # In here I access profile.country.name} 
end 

Что подразумевается сделать, это взять информацию пользователя вместе с некоторой информацией о профиле и поместить его в формат CSV.

Внутри .map Я звоню profile.country.name Это идет отлично, но Rails запускает дополнительный вызов SQL, чтобы найти имя, что я хочу сделать, - это захватить эту информацию в моем первоначальном поиске.

Моя проблема заключается в том, что из-за country связанно с profile и не user я не могу добавить его в моем .includes, потому что не видит его как вулканизующаяся таблицу. Есть ли что-нибудь, что я могу сделать, чтобы заставить включить присоединиться к таблице, связанной с profile?

Информация о соответствующей модели приведена ниже;

Пользователь:

has_one :profile, dependent: :destroy 

Профиль:

belongs_to :user 
belongs_to :country 

Страна:

has_many :profiles 

ответ

2

Вы должны быть в состоянии включить страну в первоначальном запросе, вкладывая его в профиле в. включает в себя:

User.includes({:profile => [:country], :roles}) 
+0

Cheers Barry, мне пришлось сыграть еще немного с [], чтобы заставить его работать: 'includes (: profile => [: country],: role => [])' – Toby

+0

Ах да, конечно, я забыл, что он должен стать хешем, а не массивом, чтобы разрешить key => value notation. – brrygrdn

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