2013-05-28 4 views
0

У меня есть Article модели, которая belongs_touser поэтому здесь я нахожу пользователь о конкретной статье, как показано ниже:Получить пользователь объекта в одном запросе

article = Article.find(params[:id]) 
user = User.find(article.user_id) 

Как вы видите, я этого добиться через два запроса, но я просто хочу иметь это в одном запросе. Что вы рекомендуете? Тпй.

+1

Используя ActiveRecord, вы должны выполнить два запроса, чтобы загрузить две модели. –

+0

Как сказал Алекс, вы застряли в двух запросах. Единственная альтернатива, которую я вижу, - это написать запрос sql вручную, но в любом случае это побеждает цель активной записи. –

ответ

0

попробовать это: -

article = Article.includes(:user).where("articles.id = ?", params[:id]).first 

теперь вы можете получить доступ к пользователю как article.user и никакой другой запрос не получит сигнал.

это известно как нетерпеливый нагрузки: -

подробнее об этом на рельсы руководства.

http://guides.rubyonrails.org/active_record_querying.html#eager-loading-associations

Смотри также:

http://railscasts.com/episodes/22-eager-loading
http://railscasts.com/episodes/22-eager-loading-revised

+0

Это будет работать, но все равно будет выполнять два запроса. Это действительно выгодно другим способом: 'user = User.includes (: articles) .find (user_id)' таким образом, это все еще только два запроса, даже если есть несколько статей. –

+0

Это все равно выполнит два запроса. – Mischa

2
article = Article.includes(:user).where(:id => params[:id]).first 
+0

Возвращает объект статьи. Он хочет пользователя. – Mischa

+0

Кроме того, он будет выполнять два запроса. – Mischa

1

Как насчет join?

user = User.joins(:articles).where('articles.id = ?', params[:id]).first 
+1

Это единственный правильный ответ (если ему не нужен объект статьи). – Mischa

1

К сожалению: до тех пор, пока вы хотите два объекта, в Rails нет способа выбрать данные одним запросом.

Вы можете создать запрос, который выбирает данные из Article и User в то же время, хранить пользователю конкретные данные в не БД атрибутов Article как

article = Article.where(id: params[:id]).joins(:user).select('articles.title, users.name').first 
puts article.attributes['name'] 

что выбрать все данные в одном запросе, но что действительно портит Rails. Вы не получите экземпляр User.

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