ActiveRecord Association缓存条件子句中的Date值

Oll*_*lly 2 ruby-on-rails

我的Account模型有以下两种关联:

has_many  :expenses, 
          :order => 'expenses.dated_on DESC', 
          :dependent => :destroy

has_many  :recent_expenses, 
          :class_name => 'Expense', 
          :conditions => "expenses.dated_on <= '#{Date.today}'",
          :order => 'dated_on DESC', 
          :limit => 5
Run Code Online (Sandbox Code Playgroud)

在我的一个观点中,我正在渲染最近的费用:

<% @account.recent_expenses.each do |expense| %>
...
<% end %>
Run Code Online (Sandbox Code Playgroud)

在我的开发计算机上,在登台服务器(在生产模式下运行)以及生产控制台上,@account.recent_expenses返回正确的列表.但是,在我们的实时生产服务器上,不会返回最近的费用.

如果我在视图中替换@account.recent_expenses,则会显示@account.expenses最近的开销,因此我的猜测是条件子句的一部分在第一次执行时以某种方式被缓存.如果我重新启动生产Mongrel群集,则会正确返回所有最新费用.#{Date.today}

任何人都可以想到为什么会发生这种情况以及如何更改:recent_expenses查询以防止这种情况发生?

我正在使用Rails 2.1.0.

And*_*rew 6

Rails在加载时构建查询,然后每次调用@ account.recent_expenses时都会重新使用该查询,这正是您遇到的问题.

如果你正在使用Rails 2.1,你可以使用named_scope来实现你正在寻找的东西.

在您的费用模型中,输入以下内容:

named_scope :recent, lambda { {:conditions => ["expenses.dated_on <= ?", Date.today], :order => 'dated_on DESC', :limit => 5 } }
Run Code Online (Sandbox Code Playgroud)

lambda用于确保rails每次都重建查询.

从您的帐户中删除:

has_many :recent_expenses ...
Run Code Online (Sandbox Code Playgroud)

然后打电话:

<% @account.expenses.recent.each do |expense| %>
...
<% end %>
Run Code Online (Sandbox Code Playgroud)