Select 来自关联模型的多个值 rails
Select multiple values from associated model rails
假设我有这个关联
User have_many posts
Post belongs_to user
User Post
----------------
id id
name title
user_id
如何只列出post标题和用户名includes/joins?
(post 列表 [标题 - 用户名])
@posts = Post.includes(:user).select('........')
不提供这个
@posts = Post.all.each {|p| p.user.username}
__________________UP_____________________
它适用于连接 2 个表。
如果我想将它用于更复杂的示例怎么办?
查看我的上一个问题
@Humza 的回答部分奏效了。
可能是这样的
@posts = Post.joins(:user, :category).paginate(:page => params[:page]).order("created_at DESC")
但不显示 post 没有类别
我还需要显示头像,但我想我可以将 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.includes(:user).map { |p| [p.title, p.user.name] }
将获取包含用户的 post 并将每个 post 映射到 post 标题和用户名的元组。
这可能无法完全回答您的问题,因为我认为您可能希望将查询结果限制为仅包含必填字段,在这种情况下,我 认为 您可以添加一个.select('title', 'users.name')
到查询。 (暂时无法测试)
看看pluck。
Post.joins(:user).pluck(:title, :name)
请注意,它在这种情况下有效,因为关于 name
列没有歧义,您可能需要明确指定 table (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")
结果将是一个二维数组,每个元素都是 [post_title, post_username]
形式的数组
Post.joins(:user, :category)
but It doesn't display posts that don't have category
那是因为 joins
使用 INNER JOIN
将 table 连接在一起。如果您想要 Post
中的所有内容,即使特定记录在另一个 table 中没有对应的记录,您也需要使用 LEFT JOIN
。不幸的是 ActiveRecord
没有生成它的好方法,您将需要手动执行此操作:
Post.joins("LEFT OUTER JOIN categories ON categories.post_id = posts.id")...
有关详细信息,请参阅 A Visual Explanation of SQL Joins。
假设我有这个关联
User have_many posts
Post belongs_to user
User Post
----------------
id id
name title
user_id
如何只列出post标题和用户名includes/joins?
(post 列表 [标题 - 用户名])
@posts = Post.includes(:user).select('........')
不提供这个
@posts = Post.all.each {|p| p.user.username}
__________________UP_____________________
它适用于连接 2 个表。
如果我想将它用于更复杂的示例怎么办?
查看我的上一个问题
@Humza 的回答部分奏效了。 可能是这样的
@posts = Post.joins(:user, :category).paginate(:page => params[:page]).order("created_at DESC")
但不显示 post 没有类别
我还需要显示头像,但我想我可以将 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.includes(:user).map { |p| [p.title, p.user.name] }
将获取包含用户的 post 并将每个 post 映射到 post 标题和用户名的元组。
这可能无法完全回答您的问题,因为我认为您可能希望将查询结果限制为仅包含必填字段,在这种情况下,我 认为 您可以添加一个.select('title', 'users.name')
到查询。 (暂时无法测试)
看看pluck。
Post.joins(:user).pluck(:title, :name)
请注意,它在这种情况下有效,因为关于 name
列没有歧义,您可能需要明确指定 table (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")
结果将是一个二维数组,每个元素都是 [post_title, post_username]
Post.joins(:user, :category)
but It doesn't display posts that don't have category
那是因为 joins
使用 INNER JOIN
将 table 连接在一起。如果您想要 Post
中的所有内容,即使特定记录在另一个 table 中没有对应的记录,您也需要使用 LEFT JOIN
。不幸的是 ActiveRecord
没有生成它的好方法,您将需要手动执行此操作:
Post.joins("LEFT OUTER JOIN categories ON categories.post_id = posts.id")...
有关详细信息,请参阅 A Visual Explanation of SQL Joins。