0

在 SQL 中,您可以拥有SELECT x,y FROM ...

但如果我使用where,生成的 sql 只会从它所作用的模型中选择。

例如:

user has_many :posts
post belongs_to :user

Post.includes(:users).where('created_at < ?' 1.day.ago) 会有

SELECT "posts".* FROM "posts" WHERE (created_at > '2013-03-06 07:37:09.010916')

但是我如何SELECT发布帖子和用户,以便它也会返回帖子用户?

4

2 回答 2

1

更新:正如 Saurabh 指出的,加载的关联应该是 :user 而不是 :users

Includes 用于预先加载关联记录,这意味着给定以下内容

@posts = Post.includes(:user)
@posts.each do |post|
  post.user
end

只会对数据库进行 2 个查询,一个用于获取帖子,另一个用于获取与 关联的所有用户@posts。Rails 为您管理关联。简单的。

如果要从不同的表中获取某个列值,请尝试以下操作

@posts = Post.joins(:user).select('posts.*, users.name AS user_name')
@posts.first.user_name # will give you the name of the first user associated to the post
于 2013-03-07T08:00:03.347 回答
0

首先,你的联想是错误的。当你Post.includes(:users)说:post belongs_to :user.

正确的方法是——

Post.includes(:user)对于belongs_to 关联

其次,您可以通过这样做从不同的表中选择一个值:

Post.includes(:user).where(:user => {:name => params[:name]})

上面的查询将为您提供用户名是用户表中字段的params[:name]所有帖子。:name

于 2013-03-07T09:00:09.413 回答