【问题标题】:Use active record to find a record by month and day, ignoring year and time使用活动记录按月和日查找记录,忽略年份和时间
【发布时间】:2011-08-18 03:23:04
【问题描述】:

我有一个模型(条目),有五年的记录(每天一条记录)。我需要一种方法,当传递诸如2011-12-25 00:00:00 之类的日期对象时,将向我显示12/25 发生的所有记录(查询:created_at 列),而不管过去的年份或时间。

RoR 3.0.9 / Ruby 1.9.2p290

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 activerecord rails-activerecord


    【解决方案1】:

    您可以使用 mysql 的 MONTH 和 DAY 值。可能是这样的:

    Model.where("MONTH(created_at) = ? and DAY(created_at) = ?", somedate.month, somedate.day)
    

    【讨论】:

    【解决方案2】:

    应该适用于大多数 SQL 数据库(包括 MySQL 和 PostgreSQL)的通用解决方案:

    Entry.where('extract(month from created_at) = ? AND extract(day from created_at) = ?', d.month, d.day)
    

    SQLite 不理解 extract,所以你必须使用:

    Entry.where("strftime('%m/%d', created_at) = ?", d.strftime('%m/%d'))
    

    【讨论】:

      【解决方案3】:

      假设你使用的是mysql:

      User.where(["DAY(created_at) = ? AND MONTH(created_at) = ?", date.day, date.month])
      

      【讨论】:

        【解决方案4】:

        假设 RDBMS 是 MySQL,并且您有一个带有组合框的表单来选择月份和/或 date_of_months,也许您可​​以创建一个 named_scope,例如:

        scope :by_date_or_month, lambda { |date, month| {:conditions => ["DAYOFMONTH(created_at) = ? or MONTH(created_at) = ?", date, month]}}
        

        IRB 测试:

        Model.by_date_or_month(31,8)
        Model.by_date_or_month(nil,8)
        

        【讨论】:

          猜你喜欢
          • 2013-09-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多