Class: Tush::Importer

Inherits:
Object
  • Object
show all
Defined in:
lib/tush/importer.rb

Overview

This class takes in a tush export and imports it into ActiveRecord.

Defined Under Namespace

Classes: InvalidWrapperError, NonUniqueWrapperError

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(exported_data) ⇒ Importer

Returns a new instance of Importer.



16
17
18
19
20
# File 'lib/tush/importer.rb', line 16

def initialize(exported_data)
  self.data = exported_data
  self.imported_model_wrappers = []
  self.model_to_attribute_blacklist = {}
end

Instance Attribute Details

#dataObject

Returns the value of attribute data.



12
13
14
# File 'lib/tush/importer.rb', line 12

def data
  @data
end

#imported_model_wrappersObject

Returns the value of attribute imported_model_wrappers.



12
13
14
# File 'lib/tush/importer.rb', line 12

def imported_model_wrappers
  @imported_model_wrappers
end

#model_to_attribute_blacklistObject

Returns the value of attribute model_to_attribute_blacklist.



12
13
14
# File 'lib/tush/importer.rb', line 12

def model_to_attribute_blacklist
  @model_to_attribute_blacklist
end

Class Method Details

.new_from_json(unparsed_json) ⇒ Object



27
28
29
# File 'lib/tush/importer.rb', line 27

def self.new_from_json(unparsed_json)
  self.new(JSON.parse(unparsed_json))
end

.new_from_json_file(json_path) ⇒ Object



22
23
24
25
# File 'lib/tush/importer.rb', line 22

def self.new_from_json_file(json_path)
  unparsed_json = File.read(json_path)
  self.new(JSON.parse(unparsed_json))
end

Instance Method Details

#create_models!Object



31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/tush/importer.rb', line 31

def create_models!
  model_wrappers = self.data["model_wrappers"]

  model_wrappers.each do |model_wrapper|
    model_class = model_wrapper["model_class"].constantize
    imported_model_wrapper =
      ModelWrapper.new(:model_class => model_class.to_s,
                       :model_attributes => model_wrapper["model_attributes"],
                       :blacklisted_attributes => self.model_to_attribute_blacklist[model_class])

    imported_model_wrapper.create_copy

    self.imported_model_wrappers << imported_model_wrapper
  end
end

#find_wrapper_by_class_and_old_id(klass, old_id) ⇒ Object



47
48
49
50
51
52
53
# File 'lib/tush/importer.rb', line 47

def find_wrapper_by_class_and_old_id(klass, old_id)
  wrappers = self.imported_model_wrappers.select do |wrapper|
    (wrapper.model_class == klass) and (wrapper.original_db_id == old_id)
  end

  wrappers[0]
end

#update_foreign_keys!Object

This method updates stale foreign keys after the new models have been created.



56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
# File 'lib/tush/importer.rb', line 56

def update_foreign_keys!
  models = self.imported_model_wrappers.map { |wrapper| wrapper.model_class }
  model_to_foreign_keys = AssociationHelpers.create_foreign_key_mapping(models)

  imported_model_wrappers.each do |wrapper|
    foreign_keys = model_to_foreign_keys[wrapper.model_class]

    foreign_keys.each do |foreign_key_info|
      match = self.find_wrapper_by_class_and_old_id(foreign_key_info[:class],
                                                    wrapper.model_attributes[foreign_key_info[:foreign_key]])

      if match
        new_id = match.new_model.send(match.original_db_key)
      else
        # If we don't have a model wrapper (like in the case of a copy only model),
        # remove the id
        new_id = nil
      end

      ActiveRecord::Base.transaction(:requires_new => true) do
        begin
          wrapper.new_model.update_column(foreign_key_info[:foreign_key],
                                          new_id)
        # If the column has a not null restraint, keep the original value
        rescue ActiveRecord::StatementInvalid
          raise ActiveRecord::Rollback
        end

        wrapper.new_model_attributes[foreign_key_info[:foreign_key]] = new_id
      end
    end
  end
end