2009-11-10 6 views
2

Un problème vraiment douteux que j'ai. Voici mon modèle:La portée nommée ne coopère pas avec le fuseau horaire?

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 

Maintenant, si je

@entries = Entry.published.paginate_by_blog_id @blog.id, 
     :page => params[:page], 
     :order => 'published_at DESC', 

Il ne retourne pas les messages à moins que je bouge published_at d'une heure. MAIS:

@entries = Entry.paginate_by_blog_id @blog.id, 
     :page => params[:page], 
     :conditions => ["published_at < ?", Time.zone.now], 
     :order => 'published_at DESC', 

Et ça marche bien!

Je suis fou ici, quelqu'un a des idées d'où commencer même le débogage?

Répondre

7

Les étendues nommées ne sont pas exécutées dynamiquement, de sorte que Time.zone.now est la valeur au moment du chargement de la classe. Si vous voulez que la portée nommée utilise une valeur différente à chaque appel, les conditions doivent être le résultat d'un lambda.

Jetez un oeil à http://railscasts.com/episodes/108-named-scope et http://ryandaigle.com/articles/2008/3/24/what-s-new-in-edge-rails-has-finder-functionality

Par exemple:

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

Cette 1.week.ago façon est calculée chaque fois que le champ d'application est invoquée.

+0

Merci, cela l'a résolu. Je vais lire sur le sujet tout de suite! –