0

更新

我必须将下面的代码更改为此才能正常工作:

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 } 

但从那时起,存储在哈希中的日期时间仅在其中一个属性发生更改时才会更新。这是正确的行为。

有任何想法吗?谢谢。

4

0 回答 0