module Ika::ClassMethods
Public Instance Methods
export(options = {}, objects = nil)
click to toggle source
# File lib/ika.rb, line 112 def export(options = {}, objects = nil) ika_export(options, objects) end
ika_export(options = {}, objects = nil)
click to toggle source
# File lib/ika.rb, line 77 def ika_export(options = {}, objects = nil) preset_json_with_raw_data = CarrierWave::Uploader::Base.json_with_raw_data CarrierWave::Uploader::Base.json_with_raw_data = true all_symbol = true options[:include] ||= [] options[:include] = [options[:include]] unless options[:include].is_a?(Array) objects ||= self.includes(options[:include]) options[:include].each do |opt| all_symbol = false unless opt.is_a?(Symbol) end if all_symbol json = objects.to_json(include: options[:include]) CarrierWave::Uploader::Base.json_with_raw_data = preset_json_with_raw_data return json end whole_obj_arr = [] objects.each do |object| obj_arr = Oj.load(object.to_json) options[:include].each do |relation| if relation.is_a?(::Hash) relation.keys.each do |property| obj_arr[property.to_s] = Oj.load(object.try(property).export({include: relation[property]}, object.try(property))) end elsif relation.is_a?(Symbol) obj_arr[relation.to_s] = Oj.load(object.try(relation).present? ? object.try(relation).to_json : '[]') end end whole_obj_arr.push(obj_arr) end CarrierWave::Uploader::Base.json_with_raw_data = preset_json_with_raw_data Oj.dump(whole_obj_arr) end
ika_import(json_or_array, options = {})
click to toggle source
# File lib/ika.rb, line 12 def ika_import(json_or_array, options = {}) if json_or_array.is_a?(Array) objects = json_or_array else objects = Oj.load(json_or_array) objects = [objects] unless objects.is_a?(Array) end json_or_array = nil ActiveRecord::Base.transaction do if options && options[:sync] remove_target_ids = all.pluck(:id) else remove_target_ids = [] end objects.each do |object| record_exists = false if exists?(id: object['id'].to_i) record_exists = true exist_object = where(id: object['id'].to_i).first end object_params = {} object.keys.each do |key| if object[key].is_a?(Array) reflections[key].klass.import(object[key]) else if new.try(key.to_sym).class.superclass == CarrierWave::Uploader::Base need_update = true obj_url = object[key]['url'] || object[key][:url] obj_md5 = object[key]['md5'] || object[key][:md5] obj_data = object[key]['data'] || object[key][:data] obj_name = object[key]['name'] || object[key][:name] if obj_url && File.exist?('public' + obj_url) md5 = Digest::MD5.file('public' + obj_url) need_update = false if md5 == obj_md5 && record_exists && obj_name == Pathname(exist_object.try(key.to_sym).to_s).basename.to_s end if obj_url && need_update object_params[key] = base64_conversion(obj_data, obj_name) elsif obj_url.blank? object_params[('remove_' + key).to_sym] = true end else object_params[key] = object[key] end end object.delete(key) if key != 'id' end if record_exists exist_object.attributes = object_params exist_object.save!(validate: false) else new(object_params).save!(validate: false) end remove_target_ids -= [object['id'].to_i] object.delete('id') end where(id: remove_target_ids).destroy_all end end
import(json_or_array, options = {})
click to toggle source
# File lib/ika.rb, line 73 def import(json_or_array, options = {}) ika_import(json_or_array, options) end