Отслеживание изменений в модели и сохранение результатов в другой модели

Я в приложении Rails 3.2. Я хочу, чтобы определенные поля в модели с именем Candidate сохранялись в модели Update, когда пользователь-администратор изменяет их через CRUD (что происходит с вызовом update_attributes стандартным способом скаффолда Rails).

У меня есть код в модели Candidate, который отслеживает изменения в фильтре before_save:

before_save :check_changed
def check_changed
  period_contributions_changed?
end

Это находится в файле модели кандидата.rb.

Я бы хотел, чтобы измененное значение в period_contributions и других указанных полях вызывало создание другой записи Update.

Обновление будет содержать идентификатор кандидата, имя измененного поля, предыдущее значение и новое значение.

Похоже, что для этого потребуется, чтобы код модели вызывал метод контроллера обновления, что кажется плохой практикой. Есть ли лучшая практика для этого?


person Duncan Malashock    schedule 17.01.2014    source источник
comment
Вас может заинтересовать жемчужина Paper Trail.   -  person rafroehlich2    schedule 18.01.2014


Ответы (1)


ActiveRecord предоставляет некоторые методы, которые вы можете использовать

  1. changed? -> сообщает вам идентификатор объекта, измененного
  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
    
person usha    schedule 17.01.2014