2011-05-03 34 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) 
}