undefined方法`group_by_day' - rails 3.2

时间:2013-11-04 07:11:05

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

我想使用 chartkick 制作一个用户注册数量(每天)的折线图,这是一个简单的一行代码,但是它给出了错误

`undefined method `group_by_day' for #<Class:0x00000004b4fbf0>`

在我的观点中我有

<%= line_chart User.group_by_day(:created_at).count %>

错误日志:

Rendered admin/dashboards/index.html.erb within layouts/application (145.2ms)
Completed 500 Internal Server Error in 1018ms

NoMethodError - undefined method `group_by_day' for #<Class:0x00000004b4fbf0>:
  activerecord (3.2.14) lib/active_record/dynamic_matchers.rb:55:in `method_missing'
  app/views/admin/dashboards/index.html.erb:38:in `_app_views_admin_dashboards_index_html_erb___3330517857505238097_39214860'
  actionpack (3.2.14) lib/action_view/template.rb:145:in `block in render'
  activesupport (3.2.14) lib/active_support/notifications.rb:125:in `instrument'
  actionpack (3.2.14) lib/action_view/template.rb:143:in `render'
  actionpack (3.2.14) lib/action_view/renderer/template_renderer.rb:48:in `block (2 levels) in render_template'
  actionpack (3.2.14) lib/action_view/renderer/abstract_renderer.rb:38:in `block in instrument'
  activesupport (3.2.14) lib/active_support/notifications.rb:123:in `block in instrument'
  activesupport (3.2.14) lib/active_support/notifications/instrumenter.rb:20:in `instrument'
  activesupport (3.2.14) lib/active_support/notifications.rb:123:in `instrument'
  actionpack (3.2.14) lib/action_view/renderer/abstract_renderer.rb:38:in `instrument'

3 个答案:

答案 0 :(得分:6)

要支持group_by_day,您需要捆绑来自Chartkick的同一作者的另一个gem:groupdate

答案 1 :(得分:2)

我看不到group_by_day方法的定义。这不是标准方法。可能是您引用group_by

在任何情况下,都没有为ActiveRecord类定义group_by。它在array上定义。

首先必须将记录提取到数组中。另外,如果created_at是一种方法,则需要传递使用&amp;。

User.all.group_by(&:created_at)

另外,我不确定最后的.count是否符合您的预期。它计算日期的组(如果是created_at,它将为每条记录返回几乎一个项目,因为created_at实际上很难重复)

答案 2 :(得分:0)

大概你需要这样的数据结构:

{ '2013-01-01' => 6, '2013-01-11' => 23, ... }

其中键是日期,值是该日期的注册数。

在我能找到的任何地方都没有group_by_day方法。但是,您可以在数据库(它所属的位置)内轻松完成此操作:

counts = User.group('date(created_at)').count

或等效地:

counts = User.count(:group => 'date(created_at)')

这两个请求都会向数据库发送一个看起来或多或少的请求:

select count(*), date(created_at) from users group by date(created_at)

date(created_at)在PostgreSQL和MySQL中应该是一样的,我不确定其他数据库。