筛选范围内至少有一个子对象的父对象

时间:2015-09-22 14:03:42

标签: ruby-on-rails postgresql activerecord

我想返回带有作为范围一部分的图书的用户 -

class User < ActiveRecord::Base
  has_many :books
end

class Book < ActiveRecord::Base
  belongs_to :user

  scope :published, -> { where (status: 'Published') }
end

所以

Book.published

返回所有已发布的图书。我试图定义拥有一本或多本出版图书的所有用户的范围。

知道

User.joins(:books).uniq.all

返回所有拥有图书的用户(来自Rails: How to get objects with at least one child?) - 我可以为其添加范围,还是有更好的方法?

1 个答案:

答案 0 :(得分:2)

首先, 模型 类名称 应为 单数 如果我理解正确,您希望所有用户都拥有范围published范围内的图书,那么我会将scope放在User模型中稍作修改,如下所示

class User < ActiveRecord::Base
  has_many :books
  scope :published, -> { joins(:books).where(books: { status: 'Published' }) }
end

现在,您可以User.published返回所有用户的图书,其状态为 已发布