Rails测验(查找范围定义中的错误)

时间:2011-05-03 21:35:15

标签: ruby-on-rails

以下范围定义包含两个错误,导致它无法按预期工作。你能找到他们吗?

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

(列publish_at包含时间/日期,应该发布文章)。这些错误是根本性的,而不只是一个错别字。

我会接受第一个正确答案或在几天内发布解决方案。

4 个答案:

答案 0 :(得分: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]
}

答案 1 :(得分: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 :(得分:2)

作为补充参考,转换为rails 3的已接受答案是:

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

答案 3 :(得分:0)

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