カテゴリー:
Rails
タグ:
 Sql having Rails

このエントリーをはてなブックマークに追加
更新日時:
2015年01月17日(土)
作成日時:
2015年01月17日(土)

前の記事 / 次の記事

ActiveRecord脳になっているとSQLとかかなり忘れてる訳で、
子レコードの数を条件にレコード抽出ってできた気がするんだけど
完全に忘れたので改めて調べてメモ。

参考
[SQL]重複するデータ件数を集計する

次のような時

Parent < ActiveRecord::Base
  has_many :children
end

Child < ActiveRecord::Base
  belongs_to :parent
end

例えばchildrenを3つ以上持っているparentの抽出には次のようなSQLを使える

select * from parents where id IN (
  select parent_id from children group by parent_id having count(*) >= 3
);

ActiveRecordで書くと次のように書ける

Parent.where(id: Children.select(:parent_id).
  group(:parent_id).having("count(parent_id) >= ?", 3) );

ちなみにこの時(where の条件に配列を渡した時)、
ActiveRecordでは自動的にIN句が利用される。