2011-05-03 35 views
0

以下作用域定義包含兩個錯誤,導致它不能按預期工作。你能找到他們嗎?Rails測驗(找到作用域定義中的錯誤)

named_scope :articles_to_display, 
      :conditions => ["articles.publish_at < (?)", Time.now] 

(列publish_at包含時間/日期,文章應該發佈時)。這些錯誤是基本錯誤,不僅僅是錯別字。

我會接受第一個正確的答案或在幾天後發佈解決方案。

+0

假設軌道2.X? – DGM 2011-05-03 21:39:30

+0

是的,Rails 2.x,我不熟悉Rails 3.x,但我敢打賭,至少有一個問題也適用於它們,更可能兩者都適用。 – Michal 2011-05-03 21:47:09

+0

所以你知道正確答案? OO。 – fl00r 2011-05-03 21:52:15

回答

4

第一個問題是,Time.now在評估(使用Ruby讀取文件時)的類級別,並且在使用範圍時(這是您最有可能預期的)不進行評估。在這種情況下,您需要將條件生成包裝在lambda/proc中。

named_scope :articles_to_display, lambda { 
    :conditions => ["articles.publish_at < (?)", Time.now] 
} 

第二個問題是可能是您想使用Time.zone.now而不是Time.now尊重當前的請求,而不是系統時間在服務器上的本地化時間。

以下是你想要什麼直到結束:

named_scope :articles_to_display, lambda { 
    :conditions => ["articles.publish_at < (?)", Time.zone.now] 
} 
+0

我應該抓住拉姆達,因爲我一直使用它們來獲取動態參數。雖然我不知道Time.zone。我的主要項目是一個內部站點,都在一個時區內進行。 :P – DGM 2011-05-04 12:29:39

0
named_scope :articles_to_display, 
      :conditions => ["articles.publish_at IS NOT NULL AND articles.publish_at <= (?)", Time.now] 
+0

快速嘗試,很好。但空值不是問題(它只是沒有通過條件)。如果我們不關心第二精度,那麼 Michal 2011-05-03 21:45:39

2
named_scope :articles_to_display, :conditions => ["articles.publish_at < (?)", DateTime.now] 

或者嘗試PROC

named_scope :articles_to_display, proc{ :conditions => ["articles.publish_at < (?)", DateTime.now]} 

這裏曾是超人的照片,被刪除:d

2

有關其他參考,公認的答案,轉換成軌道3是:

scope :articles_to_display, lambda { 
     where("articles.publish_at < (?)", Time.zone.now) 
}