从相关模型中提取

时间:2013-11-30 20:40:31

标签: sql ruby-on-rails ruby performance postgresql

我有两个模型,UserPostPost属于UserUser有一个标题为name的字段。我想摘下用户的名字。我在考虑做这样的事情。

some_cool_posts = Post.limit(5)

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

不幸的是,pluck不适用于数组,所以我做

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

我想知道在Rails中有更快的方法吗?

2 个答案:

答案 0 :(得分:1)

你有6个db请求,如果使用includes()那么你将有两个请求

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

答案 1 :(得分:-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 }