1

私はActiveRecordとMySQLでRails3.2を使用しており、1対多の関連付けを持つモデルがあります。

class Author
  has_many :books
end

class Book
  belongs_to :author
  attr_accessible :review
end

レビューなしですべての本を持っている著者を見つけたいです。私は試した:

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

しかし、レビューなしで少なくとも1冊の本を持っている著者が見つかるため、明らかに機能しませんでした。どのクエリを使用する必要がありますか?

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クエリ言語に変換するには時間がかかる場合があります...OK、次のようになります。

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')

編集:これにより、レビューのない少なくとも1冊の本を持つすべての著者が取得されます。あなたの質問が少し違うことに気づきました。

こんな感じになります。

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_onehas_many一方の側に関係を持ち、もう一方の側に関連付けを行うことは常に良い習慣belongs_toです。

于 2013-03-27T13:17:18.793 に答える