0

私の中に次のメソッドがありますconcern

  def all_calculated_stats(sport, group = false)
    calculated_stats = Stat.calculated(sport.id, id)
    calculated_stats = calculated_stats.group_by { |stat| stat.stat_type.stat_type_category.name } if group
    return calculated_stats
  end

計算範囲:

  scope :calculated, ->(sport_id, athlete_id) { joins(:stat_type => :stat_type_category).where('stat_types.calculated = ? AND stat_type_categories.sport_id = ? AND stats.athlete_id = ?', true, sport_id, athlete_id) }

オブジェクトを明らかにグループ化するために複数の select ステートメントが実行される場合group_by、オブジェクトをグループ化しながらこれを回避する方法はありますか?

4

1 に答える 1

1

元のクエリに参加できると思われる情報を取得するために複数のクエリを実行しているだけです。

Stat.calculated(sport.id, id).joins(:stat_type => :stat_type_category)

stat_typeこれにより、関連するオブジェクトとオブジェクトがロードされstat_type_categoryます。

ただし、これはいくつかの仮定に基づいています。

まず、それらは両方とも単一カーディナリティの関連付けです。つまりhas_one :stat_typebelongs_to :stat_typeそうしないと、クエリから返される結果が多すぎます。

第二に、返されるすべてのStatインスタンスにstat_typestat_type_category. そうでない場合、 を使用したクエリでは返されませんjoins

グループ化が必要な場合にのみ結合を実行することもできます。そうしないと、必要以上に完全なクエリを実行することになります。例えば

calculated_stats = Stat.calculated(sport.id, id)
if group
  calculated_stats = calculated_stats.joins(:stat_type => :stat_type_category)
  calculated_stats = calculated_stats.group_by { |stat| stat.stat_type.stat_type_category.name }
end
return calculated_stats
于 2013-07-25T20:24:07.293 に答える