Я работаю над приложением Rails, где мне нужно показать контрольный журнал для Record, который has_many Data. У меня есть paper_trail в моей записи и связанные модели Datum, и он отлично сохраняет их версии.
Однако мне нужно, чтобы одна версия для записи создавалась при каждом изменении одного или нескольких связанных данных. В настоящее время он создает версии для каждого изменяющегося Данного, но он создает версию Записи только в том случае, если атрибуты Записи изменяются; он не делает этого, когда связанные данные меняются.
Я попытался поместить touch_with_version в обратный вызов After_touch Record, например:
class Record < ActiveRecord::Base
has_many :data
has_paper_trail
after_touch do |record|
puts 'touched record'
record.touch_with_version
end
end
и
class Datum < ActiveRecord::Base
belongs_to :record, :touch => true
has_paper_trail
end
Обратный вызов after_touch срабатывает, но, к сожалению, он создает новую версию для каждого Datum, поэтому, когда создается запись, у нее уже есть около 10 версий, по одной для каждого Datum.
Есть ли способ узнать в обратных вызовах, была ли создана версия, чтобы я не создавал несколько? Например, проверить один из обратных вызовов Record и, если Datum уже запустил версию, больше не делать?
Спасибо!
after_touch
— хорошая идея, но может быть сложно предотвратить дублирование версийRecord
. Вместо этого, как насчет того, чтобы начать транзакцию, обновитьData
, обновитьRecord
, а затем зафиксировать транзакцию. Если все обновления происходят в одной транзакции, какой результат вы получите? - person Jared Beck   schedule 11.10.2015Data
belong_to
Record
, поэтому все эти сохранения просто происходят в ходе создания/обновления дляRecord
. Еще одна проблема: если несколькоData
создадут несколько версий дляRecord
, я думаю, что мне нужно сохранить последнюю версию, а не первую, если я хочу, чтобы запись синхронизировалась с ее данными. Спасибо за ваш совет - я все еще новичок в Rails, и я не уверен, что еще достаточно думаю в Rails. Работаю над этим! - person David Ham   schedule 12.10.2015Record
уже находятся в транзакции (я думаю?) из-за ассоциации с Rails. Должен ли я отключить обратные вызовы paper_trail, например:has_paper_trail on: []
, а затем создать свои собственные обратные вызовыafter_create
иafter_update
с помощью ``` Record.transaction do record.update record.touch_with_version end ``` - person David Ham   schedule 12.10.2015belongs_to :record, touch: true
в своем классе Datum, это создало бы временную метку, которую я хочу на моем Записывать. - person David Ham   schedule 15.12.2015