2009-11-10 51 views
2

我有一個真正的狡猾問題。這裏是我的模型:命名範圍不與時區合作?

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', 

它工作正常!

我要瘋了這裏,任何人有地方甚至開始調試任何想法?

回答

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-finder-functionality

例如:

named_scope :recent, lambda { { :conditions => ['created_at > ?', 1.week.ago] } } 

這樣1.week.ago計算每個範圍內調用時間。

+0

謝謝,這解決了它。我會馬上閱讀這個話題! – 2009-11-16 15:51:05