views:

74

answers:

1

Hi guys,

A really dodgy problem I've got. Here's my model:

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

Now if I do

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

It does not return posts unless i move published_at back one hour. BUT:

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

And it works fine!

I'm going nuts here, anyone has any ideas of where to even start debugging?

+4  A: 

named scopes are not run dynamically, so the Time.zone.now is the value at class load time. If you want the named scope to use a different value with each call, then the conditions need to be the result of a lambda.

Take a look at http://railscasts.com/episodes/108-named-scope and http://ryandaigle.com/articles/2008/3/24/what-s-new-in-edge-rails-has-finder-functionality

For example:

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

This way 1.week.ago is calculated every time the scope is invoked.

danivovich
Thanks, this solved it. I'll be reading up on the topic right on!
The Tailor