Ruby on rails 从数据库获取与今天、昨天、今天-1.5周、今天-1.5个月相关的数据

Ruby on rails 从数据库获取与今天、昨天、今天-1.5周、今天-1.5个月相关的数据,ruby-on-rails,ruby,Ruby On Rails,Ruby,我有一个对象和一个结果表 对象有很多结果 结果属于对象 结果有一列名为kg 我需要为每个对象获取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个月前的结果) 或者进行4次查询并

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

  • 对象有很多结果
  • 结果属于对象
结果有一列名为
kg

我需要为每个
对象
获取
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个月前的结果)

  • 或者进行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)
    

  • 您应该能够在请求中构建一个

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

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

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

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

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

    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');
    

    在确切日期(例如2周前)未创建的结果如何。它们将包含在第一个示例中,但不包含在第二个示例中。此外,
    Object
    是Ruby中现有的类,几乎是所有其他类的父类。您不应该使用它来表示业务逻辑(尤其不是作为ActiveRecord类)。我的表有不同的名称,为了回答您的第一个问题,我不需要任何其他日期。因此,我的问题是哪个选项更好,带I query的选项加载更多记录,或者4个查询,每个查询只加载一行。IN
    查询中的
    不是介于
    之间的
    查询。结果集将只包含在确切日期创建的结果(不是它们之间的结果)。是的,但是如果你仔细阅读他的问题,他要找的是
    中的一个
    ,而不是
    之间的一个
    。这是正确的。但是,您的答案看起来好像在
    中作为
    中的值给出的值实际上被评估为介于
    之间的
    。这是我发表评论的唯一原因:)
    
    SELECT * from results WHERE DATE(created_at) IN ('2013-12-16', '2013-12-15', '2013-12-09', '2013-11-16');