从今天,昨天,今天-1.week,今天-1.month获取与数据相关的数据

时间:2013-12-16 11:33:47

标签: ruby-on-rails ruby

我有一个对象和一个结果表

  • 对象has_many结果
  • 结果belongs_to Object

结果有一个名为kg的列。

我需要获取每个object kg数据

where('DATE(created_at) = ?' Date.today AND Date.today - 1.day AND Date.today - 1.week AND Date.today - 1.month)

所以我的问题是,这是我最好的选择:

  1. 获取1个月的所有记录(日期在今天和今天之间 - 1.月),然后得到今天,昨天,1周前和1个月前的结果)

    today = result.where("DATE(created_at) BETWEEN ? AND ?", Date.today - 1.month, Date.today)
    
  2. 或者进行4次查询并获取每个日期的数据?

    today = result.where('DATE(created_at) = ?' Date.today)
    y = result.where('DATE(created_at) = ?' Date.today - 1.day)
    w = result.where('DATE(created_at) = ?' Date.today - 1.week)
    m = result.where('DATE(created_at) = ?' Date.today - 1.month)
    

2 个答案:

答案 0 :(得分:1)

您应该能够构建IN请求。

result.where('DATE(created_at) IN (?)', [Date.today, Date.today - 1.day])

将检索提供日期之间的记录。

答案 1 :(得分:1)

根据您希望以后使用结果的方式,使用第二种方法单独查询它们可能是有意义的。这样,您就不必在结果集中进一步分离它们。

如果您实际上不需要在第一种方法中查询的数据,则从数据库中检索它们是没有意义的。然后,您应该使用另一种更具体的方法。

如果您的实际查询比问题中显示的查询更复杂,或者您只想要一个结果集,那么使用以下只需要一个查询的方法可能是有意义的:

dates = [
  Date.today,
  Date.today - 1.day,
  Date.today - 1.week,
  Date.today - 1.month
]

resultset = Result.where('DATE(created_at) IN (?)', dates)

此查询将导致类似于此的SQL查询:

SELECT * from results WHERE DATE(created_at) IN ('2013-12-16', '2013-12-15', '2013-12-09', '2013-11-16');