繁体   English   中英

从关联的模型导轨中选择多个值

[英]Select multiple values from associated model rails

假设我有这个关联

User have_many posts
Post belongs_to user

User   Post
----------------
id     id
name   title
       user_id

如何只列出包含标题/标题的帖子标题和用户名?

(帖子列表[标题-用户名])

@posts = Post.includes(:user).select('........')

不要提供这个

@posts = Post.all.each {|p| p.user.username}

__________________UP_____________________

它适用于连接2个表。

如果我想将其用于更复杂的示例怎么办?

看看我的上一个问题优化sql查询rails

@Humza的答案部分起作用。 可能是这样的

@posts = Post.joins(:user, :category).paginate(:page => params[:page]).order("created_at DESC")

但不会显示没有类别的帖子

我还需要显示gravatar,但是我想我可以只将user.email用作usr_email并使用gravatar_for(post.usr_email),但是我必须为此自定义gravatar助手。

posts_controller.rb

def index
  @posts = Post.includes(:user).includes(:comments).paginate(:page => params[:page]).order("created_at DESC")
end

index.html.erb

 <%= render @posts %>

_post.html.erb

<%= gravatar_for post.user, size:20 %>
<%= link_to "#{post.title}", post_path(post) %>
<%= time_ago_in_words(post.created_at) %> 
<%= post.comments.count %>
<%= post.category.name if post.category %>

看一下拔毛

Post.joins(:user).pluck(:title, :name)

请注意,在这种情况下它可以工作,因为name列没有歧义,您可能希望显式指定表( pluck(:title, "users.name") )。

includes在急切加载的情况下。 在这种情况下,您需要joins

posts = Post.joins(:user).select("posts.title AS title, users.name AS username")

您可以通过以下方式访问值:

post = posts.first
post.title # will give the title of the post
post.username # will give the name of the user that this post belongs to

如果你能pluck多列,那么下面可能对你更有用。

posts = Post.joins(:user).pluck("posts.title", "users.name")

结果将是一个2D数组,每个元素都是[post_title, post_username]形式的数组

您可以在范围上调用数组方法,以便:

Post.includes(:user).map { |p| [p.title, p.user.name] }

将获得包含用户的帖子,并将每个帖子映射到帖子标题和用户名的元组。

这可能无法完全回答您的问题,因为我认为您可能希望将查询结果限制为仅必填字段,在这种情况下,我认为您可以将.select('title', 'users.name')到查询。 (目前无法测试)

Post.joins(:user, :category)

但不会显示没有类别的帖子

这是因为joins使用INNER JOIN将表joins在一起。 如果您想要从Post获得所有内容,即使该特定记录在另一个表中没有对应的记录,则需要使用LEFT JOIN 不幸的是, ActiveRecord没有生成它的好方法,您将需要手动进行:

Post.joins("LEFT OUTER JOIN categories ON categories.post_id = posts.id")...

有关更多信息,请参见SQL连接的直观说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM