命名范围不与时区合作?

Ant*_*tre 2 timezone named-scope ruby-on-rails

我遇到了一个非常狡猾的问题.这是我的模特:

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
Run Code Online (Sandbox Code Playgroud)

现在,如果我这样做

@entries = Entry.published.paginate_by_blog_id @blog.id,
        :page => params[:page],
        :order => 'published_at DESC', 
Run Code Online (Sandbox Code Playgroud)

除非我将published_at移回一小时,否则它不会返回帖子.但:

@entries = Entry.paginate_by_blog_id @blog.id,
        :page => params[:page],
        :conditions => ["published_at < ?", Time.zone.now], 
        :order => 'published_at DESC', 
Run Code Online (Sandbox Code Playgroud)

它工作正常!

我在这里疯了,任何人都有任何想法甚至开始调试?

dan*_*ich 7

命名范围不是动态运行的,因此Time.zone.now是类加载时的值.如果希望命名范围对每次调用使用不同的值,则条件必须是lambda的结果.

请查看http://railscasts.com/episodes/108-named-scopehttp://ryandaigle.com/articles/2008/3/24/what-s-new-in-edge-rails-has-取景器的功能

例如:

named_scope :recent, lambda { { :conditions => ['created_at > ?', 1.week.ago] } }
Run Code Online (Sandbox Code Playgroud)

这样,每次调用范围时都会计算1.week.ago.