1

章がある(たとえば)本のリストを返すスコープが必要です。この投稿を見つけました。

章がある本を選ぶのに役立ちました。しかし、それらを選択したい場合は、次のような章がありません。

    class Book
      scope :long, joins(:chapters).
        select('books.id, count(chapters.id) as n_chapters').
        group('books.id').
        having('n_chapters = 0')
    end

このスコープは何も返しません。あなたは私を助けることができます?

4

1 に答える 1

2

を使用すると、すでに接続されているjoins本と章のすべての組み合わせとの関係が作成されます。これは、SQL 節を介して行われます。すべての可能な組み合わせを作成する場合は、作成する必要があります (本 + 無効化された章を含む)。INNER JOINOUTER JOIN

交換

joins(:chapters).

joins('LEFT OUTER JOIN chapters ON books.id=chapters.book_id').

ただし、この場合は、NOT IN代わりに SQL 句を使用することを検討してください。ここみたいに:

scope :long, lambda { where('id NOT IN (%s)' % Chapter.select(:book_id).to_sql) }

これは、かなり小さく/高速で、読みやすく/保守しやすい構造です。

于 2012-09-07T16:30:32.707 に答える