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) }

group_by运行多个选择语句以将对象明显地组合在一起时,是否有办法在仍然对对象进行分组的同时避免这样做?

4

1 回答 1

1

它只运行多个查询来获取我怀疑您可以加入原始查询的信息。

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

这将加载关联的stat_typestat_type_category对象。

这是基于几个假设。

首先,它们都是单基数关联。即has_one :stat_typebelongs_to :stat_type- 否则你会从查询中得到太多的结果。

Stat其次,将要返回的所有实例都有 astat_type和 a stat_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 回答