2013-11-30 5 views
0

У меня две модели, User и Post. Post принадлежит к User. User имеет поле под названием name. Я хочу выщипывать имена пользователей. Я думал сделать что-то подобное.Выщипывание из ассоциированной модели

some_cool_posts = Post.limit(5) 

some_cool_posts.map(&:user).pluck(:name) 

К сожалению, срывать не работает с массивами так, то я

some_cool_posts.map(&:user).map(&:name) 

мне интересно, есть ли более быстрый способ сделать это в Rails?

+0

Try: 'User.first.posts.pluck (: сообщение)' – vee

+0

Мда. Что делать, если я хочу найти имена пользователей списка сообщений, которые у меня есть? – jason328

+0

Что такое some_cool_posts? – Philip7899

ответ

1

Вы есть 6 запросов к БД, если использование включает в себя(), то вы будете иметь два запрос

some_cool_posts = Post.includes(:users).limit(5) 
some_cool_posts.map(&:user).map(&:name) 

И вы можете получить сообщения с именами пользователей, для одного запроса, как:

some_cool_posts = Post.joins(:user).select('posts.*, users.name as user_name').limit(5) 
some_cool_posts.map &:user_name 

и, IMHO, самый быстрый способ:

some_cool_posts = Post.limit(5) 
uids = some_cool_posts.map &:user_id 
User.where(id: uids).pluck :name 
+0

Хм спасибо. Если никто другой не ответит через день или два, я вознагражу вас за кредит. Было бы неплохо увидеть, какие контрольные точки находятся между различными вариантами. – jason328

-1

Если я правильно понять, вы также можете сделать:

@posts_users = some_cool_posts.collect {|post| post.user } 
@users_names = @posts_users.collect { |user| user.name } 

и вы можете попробовать сократить его на это, но я не уверен, что это будет работать:

@users_names = some_cool_posts.collect {|post| post.user }.collect { |user| user.name } 
+0

Я немного очистил свой вопрос и изменил его, чтобы отразить ситуацию, в которой я нахожусь. – jason328

+0

Я обновил свой ответ. – Philip7899

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