class ActiveAdmin::Exportable::Importer
Public Class Methods
new(path: nil, data: nil, json: nil, yaml: nil, allow_update: false, ignore_ids: false, format: nil)
click to toggle source
# File lib/active_admin/exportable/importer.rb, line 6 def initialize(path: nil, data: nil, json: nil, yaml: nil, allow_update: false, ignore_ids: false, format: nil) @data = data if data.present? @data ||= path_to_data(path, format: format) if path.present? @data ||= json_to_data(json) if json.present? @data ||= yaml_to_data(yaml) if yaml.present? @allow_update = allow_update @ignore_ids = ignore_ids end
Public Instance Methods
import()
click to toggle source
# File lib/active_admin/exportable/importer.rb, line 15 def import ActiveRecord::Base.transaction do process_associations_content(@data) end end
Private Instance Methods
assign_relation_if_needed(record, relation, relation_name)
click to toggle source
# File lib/active_admin/exportable/importer.rb, line 82 def assign_relation_if_needed(record, relation, relation_name) record.send("#{relation_name}=", relation) if relation.present? end
create_and_assign_belongs_to_associations(record, data)
click to toggle source
# File lib/active_admin/exportable/importer.rb, line 86 def create_and_assign_belongs_to_associations(record, data) filter_belongs_to_associations(data).each do |association_data| association_record = process_data(association_data[:content]) record.send("#{association_data[:name]}=", association_record) end end
create_non_belongs_to_associations(record, data)
click to toggle source
# File lib/active_admin/exportable/importer.rb, line 93 def create_non_belongs_to_associations(record, data) filter_non_belongs_to_associations(data).each do |association_data| process_associations_content(association_data[:content], relation: record, relation_name: association_data[:inverse]) end end
filter_belongs_to_associations(data)
click to toggle source
# File lib/active_admin/exportable/importer.rb, line 100 def filter_belongs_to_associations(data) data[:associations].select { |a| a[:kind] == 'belongs_to' } end
filter_non_belongs_to_associations(data)
click to toggle source
# File lib/active_admin/exportable/importer.rb, line 104 def filter_non_belongs_to_associations(data) data[:associations].reject { |a| a[:kind] == 'belongs_to' } end
find_or_initialize_from_data(data)
click to toggle source
# File lib/active_admin/exportable/importer.rb, line 70 def find_or_initialize_from_data(data) klass = data[:class_name].constantize data[:attributes][:id] = nil if @ignore_ids where_opts = if data[:attributes][:id].present? { id: data[:attributes][:id] } elsif klass.respond_to?(:exportable_search_attributes) klass.exportable_search_attributes.to_h { |x| [x, data[:attributes][x]] } end record = klass.where(where_opts).take if where_opts.present? record || klass.new end
json_to_data(json)
click to toggle source
# File lib/active_admin/exportable/importer.rb, line 33 def json_to_data(json) JSON.parse(json) end
path_to_data(path, format: nil)
click to toggle source
# File lib/active_admin/exportable/importer.rb, line 23 def path_to_data(path, format: nil) format ||= path.match(/.(?<format>\w+)$/)[:format] case format.to_s when 'json' json_to_data(File.open(path).read) when 'yaml' yaml_to_data(File.open(path).read) end end
process_associations_content(content, relation: nil, relation_name: nil)
click to toggle source
# File lib/active_admin/exportable/importer.rb, line 41 def process_associations_content(content, relation: nil, relation_name: nil) if content.is_a?(Array) content.each do |c| process_data(c.with_indifferent_access, relation: relation, relation_name: relation_name) end else process_data(content.with_indifferent_access, relation: relation, relation_name: relation_name) end end
process_data(data, relation: nil, relation_name: nil)
click to toggle source
# File lib/active_admin/exportable/importer.rb, line 51 def process_data(data, relation: nil, relation_name: nil) record = update_or_create_record_from_data(data) assign_relation_if_needed(record, relation, relation_name) create_and_assign_belongs_to_associations(record, data) record.save! create_non_belongs_to_associations(record, data) record rescue StandardError => e raise "#{e.message} - details: #{record.inspect}" end
update_or_create_record_from_data(data)
click to toggle source
# File lib/active_admin/exportable/importer.rb, line 62 def update_or_create_record_from_data(data) record = find_or_initialize_from_data(data) return record if !@allow_update && !record.new_record? record.attributes = data[:attributes] record end
yaml_to_data(yaml)
click to toggle source
# File lib/active_admin/exportable/importer.rb, line 37 def yaml_to_data(yaml) YAML.safe_load(yaml) end