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