我在我的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">
我输了数。这必须只是某种语法问题,但我遇到了麻烦。如何计算加起来的数量?
答案 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_count
和total_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可能会使用你的数据库所做的列名,但是如果确实如此,我也不想将它用作方法名。