0

我有桌子:

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

4

1 回答 1

2

我认为您对控制台输出有点困惑。

你这样说:

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

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

不要害怕,您选择的值确实存在。如果你说:

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

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

于 2013-07-18T05:06:23.480 回答