【问题标题】:Howto: Model scope for todays records如何:为今天的记录建模范围
【发布时间】:2016-03-11 04:14:35
【问题描述】:

嘿, 如何将 rails 3 中的范围设置为今天的记录?

这还行不通。我没有得到任何数据。

class MyModel < ActiveRecord::Base
    scope :today, :conditions => { :created_at => Date.today }
end

【问题讨论】:

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


    【解决方案1】:

    由于“created_at”列包含日期和时间,但您只需要比较日期,您有两种方法(我假设您使用 MySQL):

    1. 使用BETWEEN
      scope :today, lambda { WHERE("created_at BETWEEN '#{DateTime.now.beginning_of_day}' AND '#{DateTime.now.end_of_day}'") }
    2. 使用DATE()函数:
      scope :today, lambda { WHERE('DATE(created_at) = ?', Date.today)}

    此外,您可以将“created_on”列添加到仅包含日期的表中。

    更新:

    def self.up
       add_column table_name, :created_on, :date  
       add_column table_name, :updated_on, :date
    end
    

    scope :today, lambda { where(created_on: Date.today) }

    【讨论】:

    • 我如何告诉 rails (rake) 创建一个仅限日期的字段?
    • 您只需将“created_on”和“update_on”字段添加到表中。这些列名很特殊,因此 Rails 会自动设置值。
    • 最终范围:范围 :today, lambda { where("created_on = ?", Date.today) }
    【解决方案2】:

    我认为您可以像这样定义一般范围:

    class MyModel < ActiveRecord::Base
      scope :created_on, lambda {|date| {:conditions => ['created_at >= ? AND created_at <= ?', date.beginning_of_day, date.end_of_day]}}
    
      def self.today
        self.created_on(Date.today)
      end
    end
    

    所以你可以使用

    >> MyModel.today #-> records created today
    >> MyModel.created_on(Date.today - 1.week) #-> records created a week ago
    

    【讨论】:

    • 从技术上讲,应该是created_at &gt;= ? AND created_at &lt;= ?,否则你会错过整整两秒钟!此外,在self.today 中,您需要self.created_**on**,而不是created_**at**
    • 我为 '>=' 和 '' 和 '
    【解决方案3】:

    Rails 在类级别评估范围,因此当您使用 :conditions => { :created_at => Date.today } 时,它会评估 Date.today 并将所有记录与预先评估的日期进行比较。为避免这种情况,请使用 lamda 定义日期或时间特定范围

     scope :today, lambda { :conditions =>[ "created_at = ? ", Date.today] }
    

    【讨论】:

    • 语法错误,意外的 tASSOC,期待 '}' ...今天,lambda { :conditions => { :created_at => Date.today }...
    • 明白了:“created_at”列包含日期和时间,但我需要只比较日期(天,没有时间)
    【解决方案4】:

    我知道这是一个老问题,但仍然可以帮助任何人。

    这是我解决这个问题的方法:

    scope :today, -> { where(created_at: DateTime.now.beginning_of_day..DateTime.now.end_of_day) }

    【讨论】:

    • 浏览文档并返回到这里,我发现这对我来说更加灵活和有用scope :date, -&gt;(date) { where(created_at: date.to_time.beginning_of_day..date.to_time.end_of_day) }
    【解决方案5】:

    IMO 这是最容易理解的方式。

      def self.created_today
        where("created_at >= ? AND created_at < ?", Date.today, Date.tomorrow)
      end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-23
      • 2012-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多