1

我正在使用带有 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

4 回答 4

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 看起来不那么奇怪了 ;-)

于 2013-03-27T13:36:40.143 回答
3

根据 WRz 的回答,我准备了自己的查询:

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

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

于 2013-04-24T14:38:51.263 回答
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)

PS:这不是确切的语法,未经测试

于 2013-03-27T13:25:28.293 回答
-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

于 2013-03-27T13:17:18.793 回答