2011-05-10 57 views
9

嘿, 如何在rails 3中將範圍設置爲今天的記錄?Howto:今日記錄的模型範圍

這個doent工作,但。我沒有收到任何數據。

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

回答

17

由於「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) }

+0

如何告訴軌道(耙)創建僅限日期字段? – fabian 2011-05-10 10:40:04

+0

您只需在表格中添加「created_on」和「update_on」字段。 這些列名是特殊的,所以值將由Rails自動設置。 – BitOfUniverse 2011-05-10 14:05:41

+0

最終範圍: 範圍:今天,拉姆達{ 其中( 「?created_on =」,Date.today) } – fabian 2011-05-10 15:24:26

7

Rails的評估在類的級別,所以當你使用範圍:條件=> {:created_at => Date.today}它計算Date.today和比較的預評估日期的所有記錄。要避免這一點LAMDA定義日期或特定時間範圍

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

語法錯誤,意想不到的tASSOC,期待 '}' ......今天,拉姆達{:條件=> {:created_at => Date.today } ... – fabian 2011-05-10 08:33:46

+0

編輯的代碼片段..嘗試它 – 2011-05-10 10:30:45

+0

得到的觀點:「created_at」列包含日期和時間,但我需要只比較日期(日期,沒有時間) – fabian 2011-05-10 10:40:54

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 
+0

從技術上來說,也許應該是'created_at> =? AND created_at <=?',否則你會失去兩秒鐘的時間!另外,在'self.today'中,你需要**上的self.created _ **,而不是''在**'上創建_ **。 – 2011-05-10 11:38:48

+0

我修復'>'和'<' for '> ='和'<=' - 我們不想錯過任何第二;)當然,應該是created_on not created_at - 感謝評論和更正! – santuxus 2011-05-10 15:24:26

2

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

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

我知道這是一個老問題,但仍然可以幫助任何人。

這是我的方式來解決這個問題:

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

+0

不錯,謝謝:) – matiss 2017-09-09 17:38:28