跟踪模型的更改并将结果保存到另一个模型

时间:2014-01-17 21:12:29

标签: ruby-on-rails rails-activerecord update-attributes

我在Rails 3.2应用程序中。当管理员用户通过CRUD更改它们时,我希望将名为Candidate的模型中的某些字段保存到更新模型中(通过标准Rails脚手架方式的update_attributes调用)。

我在Candidate模型中有代码跟踪before_save过滤器中的变化:

before_save :check_changed
def check_changed
  period_contributions_changed?
end

这是在候选模型文件candidate.rb里面。

我想要的是在period_contributions和其他指定字段中更改值以触发创建另一条记录Update。

更新将包含候选ID,更改字段的名称,前一个值和新值。

这似乎需要在Update控制器上调用一个方法的模型代码,这似乎是不好的做法。这样做有最好的做法吗?

1 个答案:

答案 0 :(得分:0)

ActiveRecord提供了一些可以使用

的方法
  1. changed? - >告诉你id对象被更改
  2. changed - >给出一组已更改的属性
  3. changed_attributes - >为您提供一个散列,其中键为已更改的属性,值为旧值

    before_save :log_changed
    
    def log_changed
      if self.changed?
        self.changed.each do |attr|
          Update.create(:candidate_id => self.id, :field => attr, 
          :new_value => self.attributes[attr], :old_value => self.changed_attributes[attr])
        end
      end
    end