0

item_idとkeyという名前の列を持つRecordテーブルがあります。Item_idは、Itemという名前のテーブルを指す外部キーです。アクティブなモデル定義は次のようになります。

class Record < ActiveRecord::Base
  belongs_to :item
end

class Item < ActiveRecord::Base
  has_many :records
end

ここで、個別のキーを持つ各アイテムに属するレコードの数を数えたいと思います。結果は次のようになります。

{
    #<Item id: 1, ...> => 19,
    #<Item id: 2, ...> => 6,
    #<Item id: 3, ...> => 21,
    #<Item id: 4, ...> => 33,
}

ハッシュオブジェクトを数えることで、これを2行で行うことができます。

records = Record.select('DISTINCT item_id, key').includes(:item)
records.each_with_object(Hash.new 0) { |e, a| a[e.item] += 1 }

純粋なアクティブレコードクエリまたはSQLステートメントを使用してそれを作成することは可能かどうか疑問に思っています。

4

2 に答える 2

6
Record.count(group: "item_id")

また

Record.select("item_id, COUNT(*) as count_all").group("item_id")

更新:あなたの状況では、以下のような個別のキーを持つレコードを数えることができます

Record.select("item_id, COUNT(DISTINCT key) as count_all").group("item_id")
于 2012-12-23T14:38:45.543 に答える
0

次のようにActiveRecordを使用して実行できます(.record_count各アイテムレコードを呼び出してカウントを取得します):

Item.
 select("items.*, count(records.id) as record_count").
 joins("left join records on records.item_id = items.id").
 group("items.id").
 all

または、条件を指定する必要がない場合は、4.1.2.4 :counter_cacheを使用できます。

于 2012-12-23T14:48:31.243 に答える