2010-12-20 46 views
0

我要创建我的活动模型的方法,有许多做法称为month_days_not_practiced赋予的天数在当月的活动没有记录任何做法for(note:days_in_month is a helper method):抓取Rails中匹配一个WHERE条件的台第一记录

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!

安迪

回答

1

把这个查询的末尾:

.group("DATE(created_at)") 
+0

这个被阻止的OrderedHash不能被强制转换为Fixnum错误,所以我将结果散列转换为数组,如下所示:.group(“DATE(created_at)”).to_a.count并且它的工作原理 – 2010-12-21 21:56:57

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 

这应该会使您的查询完全可索引和更快。

+0

没有索引created_at列? – 2010-12-20 22:16:27

+0

Ryan的答案,稍微调整一下(见评论)就足够满足我的需求了,我相信你的答案会加快速度,但现在不是必须的并发症,谢谢。 ,andy – 2010-12-21 22:02:19

相关问题