【问题标题】:Can't select rows grouping by created_at无法选择按 created_at 分组的行
【发布时间】:2013-07-18 04:44:55
【问题描述】:

我有桌子:

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

【问题讨论】:

  • 我不熟悉 ActiveRecord,但也许您需要像在常规 SQL 查询中那样为 sum(implemented_features) 提供别名。
  • 你说这个“行不通”,但你没有包括它是如何行不通的。你有错误吗?什么错误?你得到错误的结果吗?
  • 您需要在查询中包含 id 以获取活动记录吗? Summary.select("id, date(created_at) as date, ...
  • 没关系,我现在明白你的意思了。为你写一个答案:)
  • @henrikhodne 见上面的代码。我得到#&lt;ActiveRecord::Relation [#&lt;Summary id: nil&gt;]&gt; @Mike,不,我不需要行中的id。我试过你的例子。并获取#&lt;ActiveRecord::Relation [#&lt;Summary id: 1&gt;]&gt;

标签: mysql ruby-on-rails activerecord rails-activerecord


【解决方案1】:

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

你说的是:

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

所以返回的Summary 实例(包含在ActiveRecord::Relation 中)没有任何常见的Summary 属性:没有id,没有created_at,没有implemented_featured,等等。您在 ActiveRecord 对象上调用 inspect,它想向您展示对象内部的内容,这意味着它想向您展示包含的数据库属性;您的 Summary 实例没有任何常用属性,因此您会看到类似 &lt;Summary id: nil&gt; 的内容。

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

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

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

【讨论】:

    猜你喜欢
    • 2016-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-27
    • 1970-01-01
    • 1970-01-01
    • 2021-03-27
    相关资源
    最近更新 更多