更新
我必须将下面的代码更改为此才能正常工作:
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 = {}
但是,当记录首次更新时,即使revenue_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 }
但从那时起,存储在哈希中的日期时间仅在其中一个单独属性发生更改时才会更新。这是正确的行为。
有什么想法吗?谢谢。