[英]Rails Active Record scope to group objects and return object with lowest date
[英]Rails Active Record `group`: Why does this return only a few columns?
我在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">
我輸了。 這肯定只是某種語法問題,但是我遇到了麻煩。 如何獲得計數的總和?
為了將subject
包含在select子句中,您還需要將其添加到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
別名計數。 它們將成為返回對象的方法。
foos = foos.select("count(name) AS name_count").group(:bar)
foos.first.name_count # => something
Rails可能會在不為計數加別名時使用數據庫創建的列名,但是如果這樣做,我還是不想將其用作方法名。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.