Названная сфера не сотрудничает с часовым поясом? - PullRequest
2 голосов
/ 10 ноября 2009

У меня действительно сложная проблема. Вот моя модель:

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

Он не возвращает сообщения, если я не перевожу публикации на час назад. НО:

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

И все отлично работает!

Я схожу с ума здесь, у кого-нибудь есть идеи, где вообще начать отладку?

1 Ответ

7 голосов
/ 10 ноября 2009

именованные области не запускаются динамически, поэтому Time.zone.now - это значение во время загрузки класса. Если вы хотите, чтобы именованная область использовала разные значения при каждом вызове, тогда условия должны быть результатом лямбды.

Взгляните на 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 вычисляется каждый раз, когда вызывается область.

...