2012-03-26 37 views
3

非常に単純なリレーショナルデータベースを持つ非常にシンプルなRailsアプリケーションがあります。カテゴリには多数のサンプルがあります。私は単純にX個のサンプルを持つカテゴリをロードしたいと思います。ところで、うまく動作しますが、それは生のSQLを使用するためにひどくRailsのようなではありません(やや複雑な)生のSQLクエリをActiveRecord/Arelに変換しますか?

SELECT 
    categories.* 
FROM 
    categories 
JOIN 
    (SELECT 
     category_id, COUNT(*) as sample_count 
    FROM 
     samples 
    GROUP BY 
     category_id 
    ) AS subselect 
ON 
    categories.id=subselect.category_id 
WHERE 
    subselect.sample_count = X; -- where X is whatever 

:私はこのような何かをするだろう、プレーンSQLで

。そして、明らかに私はこれらのカテゴリをモデルインスタンスとして取得したいと思います:

どうすればActiveRecordやArelクエリに書き直すことができますか?それは実現可能なのでしょうか、それとも普通のSQLを使うべきですか?おそらくそれを行うための単純な方法はありますか?

答えて

1

可能に良い方法は、このページで説明するように、counter_cacheを使用することです:次のようにあなたのサンプルモデル更新belongs_toのでは

add_column :categories, :samples_count, :integer 

http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html

は、あなたのCategoryモデルにsamples_countという名前の列を追加します。 :

belongs_to :category , :counter_cache => true 

あなたは今、たとえば、条件として、カウントを使用することができます。

Category.where(:samples_count => 7) 
+0

ああ、とても素敵で清潔です!カテゴリに 'samples_count'カラムを追加することを考えていましたが、Railsに最新の状態を維持するためのロジックが組み込まれているかどうかはわかりませんでした。私はそれを追求しなかったので、自分自身を書くことを望んでいませんでした:) – Flambino

関連する問題