小编典典

无法选择按created_at分组的行

mysql

我有桌子:

+----+----------------------+---------------------+
| 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。


阅读 270

收藏
2020-05-17

共1个答案

小编典典

我认为您对控制台输出感到有些困惑。

你是这样说的:

Summary.select("date(created_at) as date, sum(implemented_features)")...

因此返回的Summary实例(包含在中ActiveRecord::Relation)没有任何常规Summary属性:no id,no
created_at,no
implemented_featured等。当您调用inspectActiveRecord对象时,它想向您显示该对象内部的内容,这意味着它想要向您显示所包含的数据库属性;您的Summary实例没有任何通常的属性,因此您会看到类似的信息<Summary id: nil>

不用担心,您选择的值确实存在。如果你说:

Summary.select(...).map(&:date)

您应该看到这些date(created_at) as date值。如果为添加别名,sum(implemented_features)则可以使用该别名作为方法名称来提取总和。

2020-05-17