我有桌子:
+----+----------------------+---------------------+
| id | implemented_features | created_at |
+----+----------------------+---------------------+
| 1 | 19 | 2013-07-18 04:10:12 |
| 2 | 6 | 2013-07-18 04:10:12 |
| 3 | 26 | 2013-07-19 04:10:12 |
| 4 | 11 | 2013-07-19 04:10:12 |
| 5 | 1 | 2013-07-20 04:10:12 |
+----+----------------------+---------------------+
当我通过MySQL直接查询时,它可以完全按照我想要的方式运行
select date(created_at) as date, sum(implemented_features) as sum from summaries group by date(created_at);
但是当我尝试将此查询转换为ActiveRecord语法时,它返回nil。
2.0.0p0 :035 > Summary.select("date(created_at) as date, sum(implemented_features)").group("date(created_at)")
Summary Load (0.5ms) SELECT date(created_at) as date, sum(implemented_features) FROM `summaries` GROUP BY date(created_at)
=> #<ActiveRecord::Relation [#<Summary id: nil>]>
如您所见,两个示例中的最终查询相同。 为什么它在ActiveRecord的情况下不起作用?
在我的rails项目中使用Rails 4.0.0,Ruby 2.0,mysql db。
答案 0 :(得分:2)
我认为你对控制台输出感到有些困惑。
你这么说:
Summary.select("date(created_at) as date, sum(implemented_features)")...
所以返回的Summary
个实例(包含在ActiveRecord::Relation
中)没有任何通常的Summary
属性:no id
,no {{1}当你在ActiveRecord对象上调用created_at
时,它想要显示对象内部的内容,这意味着它想要显示包含的数据库属性;},no implemented_featured
等。您的inspect
个实例没有任何常用属性,因此您会看到Summary
之类的内容。
不要害怕,你选择的价值确实存在。如果你说:
<Summary id: nil>
您应该看到Summary.select(...).map(&:date)
值。如果为date(created_at) as date
添加别名,则可以使用该别名作为方法名称来提取总和。