在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
帖子和用户以及它还会返回帖子用户?
答案 0 :(得分:1)
更新:正如Saurabh指出的那样,加载的关联应该是:user而不是:users
包含用于预先加载关联记录,这意味着给出以下
@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
答案 1 :(得分:0)
首先,您的关联是错误的。当您说:Post.includes(:users)
时,您无法post belongs_to :user
。
正确的方法是 -
Post.includes(:user)
用于 belongs_to association 。
第二次,您可以通过以下方式从不同的表中选择一个值:
Post.includes(:user).where(:user => {:name => params[:name]})
以上查询将为您提供用户名为params[:name]
的所有帖子,其中:name
是用户表中的字段。