【问题标题】:How to filter by day of week in Rails 4.2 and sqlite?如何在 Rails 4.2 和 sqlite 中按星期几过滤?
【发布时间】:2015-06-11 01:43:20
【问题描述】:

如何按星期几检索记录?

这是我的范围:

scope :day_of_week, ->(day_of_week) { where("created_at = ?", day_of_week ) }

我试过 strftime('%w', day_of_week) 和 DAYOFWEEK() 都没有成功。

我使用数月和数年都没有问题,我认为一切都在我看来。我也在计算一周中每天的项目,即使我没有收到语法错误,我也会收到 0。

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-4 sqlite


    【解决方案1】:
    date = DateTime.now
    #=> Mon, 06 Apr 2015 20:02:00 +0200
    date.strftime('%A')
    #=> "Monday"
    

    所以你必须检查created_at.strftime('%A')是否等于你感兴趣的day_of_week

    【讨论】:

    • 如果 scope :day_of_week, ->(day_of_week) { where("created_at = ?", "Monday" ) } 应该可以工作,对吧?
    • 不,在您的范围内,您正在检查与 datetime 对象的相等性,而不是字符串。
    • 有道理...你认为有办法将它合并到一个句子中吗?范围 :day_of_week, ->(day_of_week) { where(created_at.strftime('%A'), day_of_week ) } ?
    • SQLite3::SQLException: 没有这样的列:mytable.the_day_of_week: SELECT * FROM "mytable" WHERE (user_id = 1) AND "mytable"."the_day_of_week" = 'Monday'
    【解决方案2】:
    scope :day_of_week, ->(day_of_week) { where("strftime('%w', created_at) = ?", day_of_week.to_s) }
    

    是解决方案。我不太清楚为什么.to_s 有效,但似乎文档不清楚。如果我们认为 strftime 表示“字符串到时间类型”,那么它应该需要一个字符串。

    【讨论】:

      【解决方案3】:

      如果有人卡住了,Radolino 的回答是有效的,但'%w' 会像这样返回你的星期几:

      Sunday: 0, Monday: 1, Tuesday: 2, Wednesday: 3, Thursday: 4, Friday: 5, Saturday: 6
      

      但是rails方法Date::DAYS_INTO_WEEK给你这个id:

      Sunday: 6, Monday: 0, Tuesday: 1, Wednesday: 2, Thursday: 3, Friday: 4, Saturday: 5
      

      所以你需要在过滤之前检查你的params

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-10
        • 2015-05-13
        • 2022-08-10
        相关资源
        最近更新 更多