如何在where子句中选择2个或更多模型

时间:2013-03-07 07:39:49

标签: sql ruby-on-rails-3 where

在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帖子和用户以及它还会返回帖子用户?

2 个答案:

答案 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是用户表中的字段。