我正在使用带有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')
但显然不起作用,因为它找到了至少一本书而未经审核的作者。我应该使用什么查询?
答案 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
关联,这是一种很好的做法。