Rails在条件上加入或包含belongs_to

neo*_*neo 1 ruby-on-rails rails-activerecord

用户有很多帖子.

class User
  has_many :posts
end
Run Code Online (Sandbox Code Playgroud)

帖子属于用户.

class Post
  belongs_to :user
end
Run Code Online (Sandbox Code Playgroud)

我试图找到所有的帖子发布用户管理员.

我试过了:

Post.where(status: 'published').includes(:user).where(users: { admin: true })
Run Code Online (Sandbox Code Playgroud)

我明白了:

PG::AmbiguousColumn: ERROR:  column reference "admin" is ambiguous
Run Code Online (Sandbox Code Playgroud)

cor*_*ard 7

您可以使用ActiveRecord::Relation大多数范围方法来构建复杂查询.例如:

Post.where(status: 'published', user: User.where(admin: true)).includes(:user)
Run Code Online (Sandbox Code Playgroud)

这应该生成两个查询; 一个将包含具有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)
Run Code Online (Sandbox Code Playgroud)

干杯!