Как обрабатывать изменения в Wiki с помощью ActiveRecord?

У меня есть модельная статья, в которой много редакций. В редакциях есть множество столбцов, в которых хранится вся информация о статье. Статья также принадлежит к current_revision, который является первичным ключом редакции, выбранной в данный момент. Каждая редакция никогда не изменяется после создания.

Когда пользователь переходит к редактированию статьи, я хочу отобразить форму, которая показывает все поля, которые находятся в редакциях, предварительно заполненные этой информацией из current_revision. Это достаточно просто, но когда пользователь переходит на сохранение, я хочу сравнить каждое поле со значением в current_revision. Если все поля совпадают, я не хочу ничего делать и отбрасываю сообщение формы. Однако, если какие-либо поля отличаются, я хочу создать новую ревизию вместо записи в предыдущую ревизию.

Как я могу определить, изменилось ли какое-либо поле, кроме как вручную жестко закодировать тест для каждого поля ревизии?


person William Jones    schedule 27.01.2010    source источник


Ответы (1)


Есть встроенные методы для обнаружения изменений в Active Record.

У API есть хорошая документация по отслеживанию изменений: http://ar.rubyonrails.org/classes/ActiveRecord/Dirty.html.

В вашем случае нужно просто определить, какие поля были изменены в статье, а затем создать на их основе новую версию.

Что-то вроде:

article= Article.find(id)
article.attributes = params[:article]
if article.changed?  
  //new revision
end
person Toby Hede    schedule 27.01.2010
comment
Спасибо, я не был знаком с этими методами. Есть ли хороший способ определить, что определенные поля не были отправлены (например, в форме есть флажок «Имеет расширенную информацию» и, соответственно, отображаются / удаляются строки с помощью javascript) и использование отсутствия этих полей в параметрах для установки этих полей к нулю? - person William Jones; 28.01.2010