获取匹配Rails中where条件的集合的第一个记录

时间:2010-12-20 21:29:43

标签: sql ruby-on-rails activerecord

我想为我的Activity模型创建一个方法,该方法有许多名为month_days_not_practiced的实践,它给出了活动没有记录任何实践的当前月份的天数(注意:days_in_month是帮助方法):

  def month_days_not_practiced(date = Date.today)
    p = practices.where(:created_at => date.at_beginning_of_month..date.at_end_of_month).count
    days_in_month - p
  end

但是,我想每月只返回一条记录。

有人可以帮我解决我的自定义SQL(我想)吗?我现在正在画一个空白..

TIA!

安迪

2 个答案:

答案 0 :(得分:1)

将其放在查询的末尾:

.group("DATE(created_at)")

答案 1 :(得分:0)

虽然您可以通过简单的GROUP BY操作执行此操作并获取所需的记录,但您可能会发现这不是特别有效,因为这将需要服务器端排序且无法编入索引:

SELECT DATE(created_at) AS on_date, COUNT(id) AS count_for_date FROM practices GROUP BY DATE(created_at)

这将返回按日索引的条目数。没有零条目,因为它们不会被分组,但正如您所观察到的,您总是可以根据应该有多少来计算缺少的天数。

您可以使用连接对象迭代这些结果:

Practice.connection.select_rows("...").each do |date, count|
  # ...
end

优化此方法的一种方法是在架构中添加索引日期列:

add_column :practices, :created_on, :date

execute "UPDATE practices SET created_on=created_at"

add_index :practices, :created_on

保存模型时,请务必指定此字段:

class Practice < ActiveRecord::Base
  before_create :assign_created_on

protected
  def assign_created_on
    self.created_on = Date.today
  end
end

这应该使您的查询完全可转换,速度更快。