我遇到了一个非常狡猾的问题。这是我的模特:
class Entry < ActiveRecord::Base
default_scope :order => 'published_at DESC'
named_scope :published, :conditions => ["published_at < ?", Time.zone.now], :order => 'published_at DESC'
belongs_to :blog
end
现在,如果我这样做
@entries = Entry.published.paginate_by_blog_id @blog.id,
:page => params[:page],
:order => 'published_at DESC',
除非我将published_at移回一小时,否则它不会返回帖子。但是:
@entries = Entry.paginate_by_blog_id @blog.id,
:page => params[:page],
:conditions => ["published_at < ?", Time.zone.now],
:order => 'published_at DESC',
它工作正常!
我在这里疯了,任何人都有任何关于从何处开始调试的想法?
答案 0 :(得分:7)
命名范围不是动态运行的,因此Time.zone.now是类加载时的值。如果希望命名范围在每次调用时使用不同的值,则条件必须是lambda的结果。
查看http://railscasts.com/episodes/108-named-scope和http://ryandaigle.com/articles/2008/3/24/what-s-new-in-edge-rails-has-finder-functionality
例如:
named_scope :recent, lambda { { :conditions => ['created_at > ?', 1.week.ago] } }
这样,每次调用范围时都会计算1.week.ago。