Вам действительно нужно сохранить атрибуты в отдельной таблице, а затем выполнить обновление после того, как администратор просмотрит и утвердит их? Если это сценарий, вы можете просто перезаписать метод обновления, чтобы сделать что-то вроде этого:
def update(perform_updates = false)
if perform_updates
latest_approved_update = UpdateAuditor.first(:conditions => { :updatable_id => self.id, :updatable_type => self.class.name, :approved => true })
self.attributes = latest_approved_update.attributes
self.save
else
UpdateAuditor.create(:updatable_id => self.id, :updatable_type => self.class.name, :attributes => self.attributes)
end
end
ОБНОВЛЕНИЕ: Автор прокомментировал, что он хочет иметь возможность применить эту модель к всем обновлениям. Для этого вы можете добавить в модель attr_accessor, скажем, что-то вроде «execute_updates», которое, конечно, будет по умолчанию нулевым.
Если вы хотите выполнить обновление базы данных, вам сначала нужно установить для атрибута значение true, а затем запустить обновление. В противном случае обновление просто создаст новую запись UpdateAuditor, которая должна быть утверждена администратором.
class Person < ActiveRecord::Base
has_many :audits, :class_name => "UpdateAudit", :as => :auditable
attr_accessor :perform_updates
private
def create_or_update
raise ReadOnlyRecord if readonly?
if new_record?
result = create
result != false
else
if perform_updates
latest_approved_update = audits.approved.last
if latest_approved_update
self.attributes = latest_approved_update.attributes
update
else
return false
end
else
audits.create(:updated_attributes => self.attributes)
end
end
end
end
Для справки, я думаю, что переписывание методов обновления по умолчанию - опасная игра, и такое программирование лучше использовать в обратном вызове before_update
, где он и находится. Как только обновление утверждено в каком-то интерфейсе, тогда наблюдатель может выполнить обновление, перезаписывая то, что там в данный момент, до тех пор, пока не будет одобрено другое внесенное изменение. Если в данный момент в очереди есть обновляемые объекты для утверждения, пользователи могут быть предупреждены о том, что изменения ожидают утверждения и т. Д.