query:has_many其中所有子字段都是nil

时间:2013-03-27 13:03:13

标签: mysql sql ruby-on-rails ruby activerecord

我正在使用带有ActiveRecord和MySQL的Rails 3.2,我有一对多关联的模型:

class Author
  has_many :books
end

class Book
  belongs_to :author
  attr_accessible :review
end

我想找到那些所有这些书而不经审核的作者。我试过了:

Author.includes(:books).where('book.review IS NIL')

但显然不起作用,因为它找到了至少一本书而未经审核的作者。我应该使用什么查询?

4 个答案:

答案 0 :(得分:3)

SQL非常简单:

SELECT authors.name, count(books.review is not null) 
FROM authors LEFT JOIN books ON (authors.id=books.author_id) 
GROUP BY authors.name
HAVING count(books.review) == 0

将其翻译成AR查询语言可能需要一些时间...... 好的,所以看起来像这样:

Author.count('books.review', joins: :books, select: 'name', 
              group:'name', having: 'count_books_review=0')

至于我,SQL看起来不那么奇怪了; - )

答案 1 :(得分:3)

基于WRz答案,我准备了自己的查询:

Author.joins(:books).group('authors.id').having("count(books.reviews)=0")

它更适合我,因为它返回AR关系(并且WRz的查询返回一个哈希)。

答案 2 :(得分:0)

试试这个

Author.joins(:books).where('books.review is null')

编辑:这将获取至少一本没有评论的书籍的所有作者。我刚刚意识到你的问题有点不同。

就是这样的。

Authors.joins(:books).select('authors.*, count(books.id) as
total_books, count('books.review is null')
as books_without_review.group('authors.id').having(total_books ==
books_without_review)

P.S:这不是确切的语法,而且未经测试

答案 3 :(得分:-1)

请尝试以下代码。

class Author
  has_many :books
end

class Book
  belongs_to :author
  attr_accessible :review
end

authors = Author.all.collect do |author|
            if author.books.where(:review => nil).size == author.books.size
              author
            end
          end

authors.compact!

在此代码之后,作者将是一个包含所有未经审阅的书籍的作者的数组。另请注意,我将Book模型中的作者关联更改为belongs_to而不是has_one。一方是has_many关系,另一方是belongs_to关联,这是一种很好的做法。