如何:为今天的记录建模范围

时间:2011-05-10 08:23:12

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

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

这项工作尚未完成。我没有数据。

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

5 个答案:

答案 0 :(得分:21)

由于“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)}
  3. 另外,您可以将“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) }

答案 1 :(得分:16)

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

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

答案 2 :(得分:8)

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

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

答案 3 :(得分:2)

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

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

答案 4 :(得分:2)

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

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

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