2

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

1 に答える 1

7

名前付きスコープは動的に実行されないため、Time.zone.nowはクラスの読み込み時の値です。名前付きスコープで呼び出しごとに異なる値を使用する場合は、条件はラムダの結果である必要があります。

http://railscasts.com/episodes/108-named-scopeおよびhttp://ryandaigle.com/articles/2008/3/24/what-s-new-in-edge-rails-has-をご覧ください。ファインダー機能

例えば:

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

このようにして、スコープが呼び出されるたびに1.week.agoが計算されます。

于 2009-11-10T12:43:13.753 に答える