更新
我必须将下面的代码更改为此才能正常工作:
attrs_to_check.each do |attr|
if self.send("#{attr}_changed?") && ( !self.send("#{attr}_was").nil? && !self.send(attr).nil? )
self.last_updated_hash[attr] = DateTime.now
end
end
但我仍然想了解为什么我需要添加额外的 if 语句逻辑。似乎它应该是不必要的。
原来的
我正在向我的模型添加一个序列化的哈希,以记录模型中某些字段最后更新的日期时间。奇怪的是,除了第一次更新操作之外,这工作正常,无论是否对这些特定属性进行了更改,它似乎都将所有内容视为脏。更奇怪的是,即使没有对任何属性进行任何更改,它也会将其视为脏(只需单击编辑表单上的提交按钮而不进行更改)。为什么会这样?
这是模型的代码:
class ResearchCompany < ActiveRecord::Base
attr_accessible :name, :revenue_stats, :customer_qty_stats, :last_updated_hash
serialize :last_updated_hash, Hash
before_save :set_last_updated_hash
def set_last_updated_hash
attrs_to_check = ['revenue_stats', 'customer_qty_stats']
attrs_to_check.each do |attr|
if self.send("#{attr}_changed?")
self.last_updated_hash[attr] = DateTime.now
end
end
end
end
以及控制器的相关部分:
class Admin::ResearchCompaniesController < ApplicationController
def create
@company = ResearchCompany.new(params[:research_company])
if @company.save
redirect_to admin_research_companies_path
else
render 'new'
end
end
def update
@company = ResearchCompany.find(params[:id])
if @company.update_attributes(params[:research_company])
redirect_to admin_research_companies_path
else
render 'edit'
end
end
end
首次创建记录时:
self.last_updated_hash = {}
但是当第一次更新记录时,即使没有更改income_stats 或 customer_qty_stats 属性:
self.last_updated_hash = { "revenue_stats"=>Sat, 19 Oct 2013 11:29:48 -0400, "customer_qty_stats"=>Sat, 19 Oct 2013 11:29:48 -0400 }
但从那时起,存储在哈希中的日期时间仅在其中一个属性发生更改时才会更新。这是正确的行为。
有任何想法吗?谢谢。