我想为我的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!
安迪
答案 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
这应该使您的查询完全可转换,速度更快。