【问题标题】:Plucking from an Associated Model从关联模型中提取
【发布时间】:2013-11-30 20:40:31
【问题描述】:

我有两个模型,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 中是否有更快的方法来做到这一点?

【问题讨论】:

  • 试试:User.first.posts.pluck(:message)
  • 嗯。如果我想查找我拥有的帖子列表的用户名怎么办?
  • 什么是 some_cool_posts?
  • 帖子记录数组。

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


【解决方案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

而且,恕我直言,最快的方法:

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

【讨论】:

  • 嗯,谢谢。如果一两天内没有其他人回答,我会奖励你的功劳。很高兴看到不同选择之间的基准是什么。
【解决方案2】:

如果我对你的理解正确,你也可以这样做:

@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 }

【讨论】:

  • 我稍微整理了一下我的问题并改变了它以反映我所处的情况。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-16
  • 2020-10-03
相关资源
最近更新 更多