Date.current上的范围仅在Rails重新启动时更新

时间:2013-07-17 07:33:58

标签: ruby-on-rails ruby-on-rails-3 heroku

我在Heroku上托管了一个Rails 3应用程序,运行Postgres数据库。我有一个控制器动作,应该生成一个RSS提要,但我发现它永远不会更新,直到应用程序重新启动(因为我做了一个新的发布到Heroku,或者因为该网站暂时不活动所以dyno旋转下来并再次备份)。它返回了“陈旧”数据,不包括新项目。

根据我的模型中名为date的行与Date.current之间的比较来定义范围:

class Petition < ActiveRecord::Base
  scope :current, where(["petitions.date <= ?", Date.current]).order("petitions.date DESC")
  scope :published, { :conditions => { :published => true } }
end 

控制器动作如下:

class PetitionsController < ActionController::Base

  before_filter :find_diary

  def rss
    current_petitions.each do |petition|
      puts petition.date
    end                
  end

  protected

  def find_diary
    @diary = Diary.find(params[:id])
  end    

  def current_petitions
    @diary.petitions.published.current.limit(25)
  end
end

正如您所看到的,它应该返回所有今天或更早的date请愿书。它在Heroku控制台上运行良好:Diary.find(15).petitions.published.current.limit(25).first总能在今天给我一个。我可以从日志中看到,每次请求提要时它都会调用current_petitions函数。但是,如果我让网站运行24小时,那么直到昨天它仍然只显示我的请愿。如果我发布一个版本来添加任何调试代码,它会突然再次开始工作。

1 个答案:

答案 0 :(得分:2)

当你设置一个带有时间的作用域时,你需要使用lambda表达式来确保每次使用作用域时都会计算时间调用。 rails guide中有更多详细信息,但您的范围需要看起来更像:

scope :current, lambda { where(["petitions.date <= ?", Date.current]) }