【问题标题】:rails convert datetime to date within a scoperails将日期时间转换为范围内的日期
【发布时间】:2016-07-28 21:23:26
【问题描述】:

在我的模型中,我定义了以下范围:

scope :today, -> { where time_start: Date.today }

这不起作用,因为我正在将 mysql 日期时间与日期进行比较。 我正在尝试做相当于 date() mysql 函数(从日期时间中提取日期)。

【问题讨论】:

    标签: mysql ruby-on-rails datetime ruby-on-rails-4


    【解决方案1】:

    试试这个:

    scope :today, -> { where time_start: Date.today.beginning_of_day..Date.today.end_of_day }
    

    在条件中使用范围将生成BETWEEN 查询,如下所示:

    SELECT "models".* FROM "models"
        WHERE (
            "models"."time_start" BETWEEN
                '2016-07-29 00:00:00.000000' AND '2016-07-29 23:59:59.999999'
        )
    

    【讨论】:

    • 谢谢 Nic,我想过这个解决方案,但感觉就像是 hack
    • 这绝不是黑客行为。事实上,许多人会争辩说这是一种 Rails 的做事方式,而不是在查询中使用原始的和可能特定于供应商的字符串。
    • 哦,太好了!我将更改接受的答案。再次感谢!
    【解决方案2】:

    正如 Nic Nilov 所建议的那样,这是一种方法。
    其他方式,你可以这样做:

    scope :today, -> { where("date(time_start) = ?", Date.today) }
    

    结果查询将是:

    SELECT users.* FROM users WHERE (date(time_start) = '2016-07-29')

    【讨论】:

      【解决方案3】:

      我有一个名为 by_star 的 gem,它可以让您无需在模型中编写任何代码即可完成此操作。

      这段代码:

      User.today
      

      将获取当天创建的所有用户。如果您想改用time_start,请执行以下操作:

      User.today(field: :time_start)
      

      【讨论】:

        猜你喜欢
        • 2021-12-15
        • 2021-08-26
        • 2013-08-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-01
        • 1970-01-01
        相关资源
        最近更新 更多