即使没有任何属性发生更改,首先通过更新操作提交也是脏的

时间:2013-10-19 15:55:09

标签: ruby-on-rails ruby-on-rails-3 activerecord

更新

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

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 } 

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

有什么想法吗?谢谢。

0 个答案:

没有答案