Rails Active Record`group`:为什么这只返回几列?

时间:2013-12-19 04:42:23

标签: ruby-on-rails rails-activerecord

我在我的Rails应用程序中的select语句中有这个:

...
 #<DailyStat subject: "Macroeconomics", topic: "Overview Of Economics", item_count: 160, correct_item_count: 0>,
 #<DailyStat subject: "Macroeconomics", topic: "Overview Of Economics", item_count: 1, correct_item_count: 0>,
 #<DailyStat subject: "Macroeconomics", topic: "Unemployment", item_count: 1, correct_item_count: 0>,
 #<DailyStat subject: "Macroeconomics", topic: "Inflation", item_count: 2, correct_item_count: 0>,...

当我对这些列进行基本选择时,我得到了这个。现在我的问题是,当我daily_stats.select("subject, topic, sum(correct_item_count), sum(item_count)").group(:topic)聚合列以组合item_counts和correct_item_counts时,结果结果集为:

#<DailyStat topic: "Demand And Consumer Behavior">, #<DailyStat topic: "Obligations">, #<DailyStat topic: "Computerized Auditing">, #<DailyStat topic: "Inflation">, #<DailyStat topic: "Overview Of Economics">

我输了数。这必须只是某种语法问题,但我遇到了麻烦。如何计算加起来的数量?

2 个答案:

答案 0 :(得分:1)

为了在select子句中包含subject,还需要将其添加到group子句中。

daily_stats.select(
  "subject, topic, sum(correct_item_count), sum(item_count)"
).group('topic, subject')

执行此查询时,您会看到输出为:

[#<DailyStat topic: "Demand And Consumer Behavior">, #<DailyStat topic: "Obligations">, #<DailyStat topic: "Computerized Auditing">, #<DailyStat topic: "Inflation">, #<DailyStat topic: "Overview Of Economics">]

您没有看到sum(correct_item_count)sum(item_count)的原因,因为它们不是您模型的属性。

如果检查结果数组中某个对象的属性,您将看到其中的计数,但没有键。钥匙将是空的。

尝试:

daily_stats.select(
  "subject, topic, sum(correct_item_count), sum(item_count)"
).group('topic, subject').first.attributes

为简单起见,您可以为sum(...)添加别名。如下所示:

daily_stats.select(
  "subject, topic, sum(correct_item_count) as total_correct_item_count, sum(item_count) as total_item_count"
).group('topic, subject')

此查询会在您生成的每个对象上为您提供total_correct_item_counttotal_item_count属性,以便您可以按以下方式访问它们:

daily_stats.select(
  "subject, topic, sum(correct_item_count) as total_correct_item_count, sum(item_count) as total_item_count"
).group('topic, subject').first.total_correct_item_count

答案 1 :(得分:0)

别名计数。它们将成为返回对象的方法。

foos = foos.select("count(name) AS name_count").group(:bar)

foos.first.name_count # => something

当你没有为计数添加别名时,Rails可能会使用你的数据库所做的列名,但是如果确实如此,我也不想将它用作方法名。