2011-11-23 11 views
11

rails3でスコープを実行しようとしています。rails3 has_many関係の子カウントのスコープ

:book has_many :chapters 

私は範囲が欲しい:10章以上の本を返すことを望む。

(カウンタキャッシュを使用しない)このスコープをどのように構成するのが最適ですか?

ありがとうございました!

+0

なぜカウンタキャッシュはありませんか? –

+0

使用しているデータベースの投稿を記述することはできますか?私はこれが下の答えにいくつかの混乱を引き起こしていると信じています –

答えて

19

これは、あなたが軌道に乗る必要があります。

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

それは助けていますか?

+0

これは行く方法です。ここで問題となるのは、countメソッドが実際には期待どおりに機能しないということだけです。たとえば、Book.long.countは各書籍の章数を含むハッシュを返します。 Book.long.all.countをする必要があります。あまりにも悪い私は推測 –

+3

それは正しく見えるが、私はエラーが発生している: '列 "card_count"存在しない "(​​card_countは私のn_chaptersです)。 'having 'によるものはすべて正しく動作すると思われ、SQLコンソールでこれを直接実行すると、card_countカラムに確実に値が設定されます。 –

+0

他のstackoverflowのリンクをリンクするのがよいのかどうかはわかりません。しかし、私はこの投稿に似た問題がありますが、has_manyオブジェクトには特定の属性のみが必要です。ヘルプに本当に感謝しますhttp://stackoverflow.com/questions/31719184/rails-active-record-find-all-records-which-have-a-count-on-has-many-associati –

8

ああ - 上記のコメントで自分の質問に答えるために、私はHAVINGで、カウントを入れていた:

レール4.0このバージョンの作品で
class Book 
    scope :long, joins(:chapters). 
    select('books.id'). 
    group('books.id'). 
    having('count(chapters.id) > 10') 
end 
1

。 having節でcount()する必要があります。 having節は 'n_chaptersとして'見えないようです。

0

代わりにサブクエリを作成することもできます。グループ化を試みる複数のスコープを結合すると、結合がより正確です(そしてパフォーマンスが向上する可能性もあります)が、奇妙な結果に終わることがあります。サブクエリははるかに邪魔になりません。この例では、次のようになります。

class Book 
    scope :with_chapters_count, -> { 
    select('books.*'). 
    select('(select count(chapters.id) from chapters where chapters.book_id = books.id) as chapters_count') 
    } 
    scope :long, -> { 
    with_chapters_count.where("chapters_count > 10") 
    } 
end 
関連する問題