Создать новую версию paper_trail без обновления существующей записи

Я интегрировал paper_trail с моделью проекта.

Нормальный поток:-

Всякий раз, когда запись проекта в модели обновляется, в таблице версий создается новая версия с изменениями.

Требование:-

Всякий раз, когда какой-либо проект обновляется, вместо обновления самой записи проекта в модели проектов я хочу создать новую запись версии. есть ли способ сделать это?

Я использую Rails 5.1.6.2, paper_trail (10.3.0)


person kashif    schedule 30.09.2019    source источник
comment
Просто поясню: вы хотите, чтобы проект не менялся в базе данных при обновлении и по-прежнему отображал старые атрибуты после обновления? Только новую версию надо создавать? Откуда вы знаете, что существует новая версия, если исходная запись в базе данных никогда не меняется?   -  person spickermann    schedule 30.09.2019
comment
@spickermann после отправки формы вызывает действие обновления в контроллере. я хочу сохранить все эти изменения в версии, а не изменить реальный объект. затем позже, в зависимости от изменений версии, администратор одобрит/отклонит изменения и изменит исходную запись проекта.   -  person kashif    schedule 30.09.2019


Ответы (1)


Я бы попробовал использовать PaperTrail::Events::Update, хотя это не общедоступный API (он может измениться в любое время без предупреждения)

project.name = 'new name'
update = PaperTrail::Events::Update.new(project, ....)
PaperTrail::Version.create!(update.data)

Опять же, это не общедоступный API, поэтому вы лишаетесь гарантии :)

Всякий раз, когда какой-либо проект обновляется, ..

Я бы включил это только в свой ProjectController#update экшн. Вы можете использовать обратный вызов модели, например before_save, если вам действительно нужно, и throw :abort для остановить цепочка обратного вызова, но вам придется обойти неявную транзакцию.

person Jared Beck    schedule 01.10.2019