当前位置:  开发笔记 > 运维 > 正文

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

如何解决《ActiveRecordAssociation缓存条件子句中的Date值》经验,为你挑选了1个好方法。

我的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

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

<% @account.recent_expenses.each do |expense| %>
...
<% end %>

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

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

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

我正在使用Rails 2.1.0.



1> Andrew..:

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 } }

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

从您的帐户中删除:

has_many :recent_expenses ...

然后打电话:

<% @account.expenses.recent.each do |expense| %>
...
<% end %>

推荐阅读
和谐啄木鸟
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有