我有两个模型,User
和Post
。 Post
属于User
。 User
有一个标题为name
的字段。我想摘下用户的名字。我在考虑做这样的事情。
some_cool_posts = Post.limit(5)
some_cool_posts.map(&:user).pluck(:name)
不幸的是,pluck不适用于数组,所以我做
some_cool_posts.map(&:user).map(&:name)
我想知道在Rails中有更快的方法吗?
答案 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 }