def reify(version, options)
options = options.dup
options.reverse_merge!(
:version_at => version.created_at,
:mark_for_destruction => false,
:has_one => false,
:has_many => false,
:unversioned_attributes => :nil
)
attrs = version.class.object_col_is_json? ?
version.object :
PaperTrail.serializer.load(version.object)
if options[:dup] != true && version.item
model = version.item
if options[:unversioned_attributes] == :nil
(model.attribute_names - attrs.keys).each { |k| attrs[k] = nil }
end
else
inheritance_column_name = version.item_type.constantize.inheritance_column
class_name = attrs[inheritance_column_name].blank? ?
version.item_type :
attrs[inheritance_column_name]
klass = class_name.constantize
if options[:dup] || (_item = klass.unscoped.find_by_id(version.item_id)).nil?
model = klass.new
elsif options[:unversioned_attributes] == :nil
model = _item
(model.attribute_names - attrs.keys).each { |k| attrs[k] = nil }
end
end
model.class.unserialize_attributes_for_paper_trail! attrs
attrs.each do |k, v|
if model.has_attribute?(k)
model[k.to_sym] = v
elsif model.respond_to?("#{k}=")
model.send("#{k}=", v)
else
version.logger.warn(
"Attribute #{k} does not exist on #{version.item_type} (Version id: #{version.id})."
)
end
end
model.send "#{model.class.version_association_name}=", version
unless options[:has_one] == false
reify_has_ones version.transaction_id, model, options
end
unless options[:has_many] == false
reify_has_manys version.transaction_id, model, options
end
model
end