Rails在条件上加入或包含belongs_to

时间:2016-07-14 16:56:38

标签: ruby-on-rails rails-activerecord

用户有很多帖子。

class User
  has_many :posts
end

帖子属于用户。

class Post
  belongs_to :user
end

我正在尝试查找用户 发布 管理 的所有帖子

我试过了:

Post.where(status: 'published').includes(:user).where(users: { admin: true })

我明白了:

PG::AmbiguousColumn: ERROR:  column reference "admin" is ambiguous

2 个答案:

答案 0 :(得分:6)

您可以将ActiveRecord::Relation交给大多数范围方法来构建复杂查询。 E.g:

Post.where(status: 'published', user: User.where(admin: true)).includes(:user)

这应该生成两个查询;一个将包含具有admin条件的用户的子查询,另一个将加载用户(急切加载)。

请注意,您可以使用范围简化这些查询,这样可以使列的详细信息成为模型的责任:

class User < ApplicationRecord
  scope :admin, -> { where(admin: true) }
end

class Post < ApplicationRecord
  scope :published, -> { where(status: 'published') }
end

# posts from admin users, with eager loaded users
Post.published.where(user: User.admin).includes(:user)

干杯!

答案 1 :(得分:0)

添加更详细的@ coreyward的答案,如果你想要没有子查询,你可以更明确地指定users条件:

Post.where(status: 'published').
  includes(:user).
  references(:user).
  where('users.admin = ?', true)

这将生成正确的LEFT OUTER JOIN查询。