如何将SQL查询转换为ActiveRecord

时间:2014-02-26 02:04:04

标签: ruby-on-rails ruby sql-server

背景:

编写一个连接到MS SQL DB的Ruby on Rails应用程序(不要问为什么,这是我无法解决的问题),数据库很安静,最多可以有2/3百万行。

目前有一个主要的列对我来说很重要,那就是'TimeUTC',表名为ApplicationLog,查询将在ApplicationLogController中。

问题:

我想写一个我可以在两个日期传递的查询,它会使用'TimeUTC'列按天分组所有记录,并总计这两天之间的所有记录。< / p>

我有SQL查询:

DECLARE @StartDate DateTime = '2014-01-04 00:00:00' 
DECLARE @EndDate DateTime = '2014-02-04 23:59:59' 

select (dateadd(DAY,0, datediff(day,0, TimeUtc))) as [DATE], count(*) 
from applicationlog (nolock)
where TimeUtc between @StartDate and  @EndDate 
group by dateadd(DAY,0, datediff(day,0, TimeUtc))
order by [DATE] desc

我尝试从这样的事情开始:

@results = ApplicationLog.select((dateadd(DAY,0, datediff(day,0, TimeUtc)) as [date], count(*)).
           group(dateadd(DAY,0, datediff(day,0, TimeUtc))).order(date desc)

现在我是一个新手,所以我可能离赛道太远了,这不好笑,但任何帮助都会很棒。我是否以正确的方式解决这个问题,还有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

尝试使用以下代码,该代码使用嵌入了一些SQL的Arel代码。

class ApplicationLog < ActiveRecord::Base

  def self.between(range)
    columns = Arel.sql('dateadd(DAY,0,datediff(day,0,TimeUtc)) as date, COUNT(*)')
    conditions = arel_table['TimeUTC'].in(range)
    query = arel_table.project(columns).where(conditions).group([1]).order('date desc')
    ActiveRecord::Base.connection.execute(query.to_sql)
  end
end

然后使用ApplicationLog.between(1.week.ago..Time.now)