Class: MasterDataTool::MasterData

Inherits:
Object
  • Object
show all
Defined in:
lib/master_data_tool/master_data.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(spec_config, master_data_file, model_klass) ⇒ MasterData

Returns a new instance of MasterData.

Parameters:



9
10
11
12
13
14
15
16
17
18
19
20
21
# File 'lib/master_data_tool/master_data.rb', line 9

def initialize(spec_config, master_data_file, model_klass)
  @spec_config = spec_config
  @master_data_file = master_data_file
  @model_klass = model_klass

  @loaded = false

  @columns = []
  @new_records = []
  @updated_records = []
  @no_change_records = []
  @deleted_records = []
end

Instance Attribute Details

#after_countObject (readonly)

Returns the value of attribute after_count.



5
6
7
# File 'lib/master_data_tool/master_data.rb', line 5

def after_count
  @after_count
end

#before_countObject (readonly)

Returns the value of attribute before_count.



5
6
7
# File 'lib/master_data_tool/master_data.rb', line 5

def before_count
  @before_count
end

#columnsObject (readonly)

Returns the value of attribute columns.



5
6
7
# File 'lib/master_data_tool/master_data.rb', line 5

def columns
  @columns
end

#deleted_recordsObject (readonly)

Returns the value of attribute deleted_records.



5
6
7
# File 'lib/master_data_tool/master_data.rb', line 5

def deleted_records
  @deleted_records
end

#master_data_fileObject (readonly)

Returns the value of attribute master_data_file.



5
6
7
# File 'lib/master_data_tool/master_data.rb', line 5

def master_data_file
  @master_data_file
end

#model_klassObject (readonly)

Returns the value of attribute model_klass.



5
6
7
# File 'lib/master_data_tool/master_data.rb', line 5

def model_klass
  @model_klass
end

#new_recordsObject (readonly)

Returns the value of attribute new_records.



5
6
7
# File 'lib/master_data_tool/master_data.rb', line 5

def new_records
  @new_records
end

#no_change_recordsObject (readonly)

Returns the value of attribute no_change_records.



5
6
7
# File 'lib/master_data_tool/master_data.rb', line 5

def no_change_records
  @no_change_records
end

#spec_configObject (readonly)

Returns the value of attribute spec_config.



5
6
7
# File 'lib/master_data_tool/master_data.rb', line 5

def spec_config
  @spec_config
end

#updated_recordsObject (readonly)

Returns the value of attribute updated_records.



5
6
7
# File 'lib/master_data_tool/master_data.rb', line 5

def updated_records
  @updated_records
end

Class Method Details

.build(spec_config, master_data_file, load: false) ⇒ Object



24
25
26
27
28
29
# File 'lib/master_data_tool/master_data.rb', line 24

def build(spec_config, master_data_file, load: false)
  model_klass = Object.const_get(master_data_file.table_name.classify)
  new(spec_config, master_data_file, model_klass).tap do |record|
    record.load if load
  end
end

Instance Method Details

#affected?Boolean

Returns:

  • (Boolean)


104
105
106
107
# File 'lib/master_data_tool/master_data.rb', line 104

def affected?
  return @affected if instance_variable_defined?(:@affected)
  @affected = affected_records.any?
end

#affected_recordsObject



72
73
74
# File 'lib/master_data_tool/master_data.rb', line 72

def affected_records
  new_records + updated_records + deleted_records
end

#basenameObject



32
33
34
# File 'lib/master_data_tool/master_data.rb', line 32

def basename
  @master_data_file.basename
end

#import!(dry_run: true, delete_all_ignore_foreign_key: false) ⇒ Object



121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
# File 'lib/master_data_tool/master_data.rb', line 121

def import!(dry_run: true, delete_all_ignore_foreign_key: false)
  raise MasterDataTool::NotLoadedError unless @loaded

  MasterDataTool::Report::ImportReport.new(self).tap do |report|
    return report if dry_run
    return report unless affected?

    disable_foreign_key_checks if delete_all_ignore_foreign_key
    @model_klass.delete_all
    enable_foreign_key_checks if delete_all_ignore_foreign_key

    # マスターデータ間の依存がある場合に投入順制御するのは大変なのでこのタイミングでのバリデーションはしない
    @model_klass.import(import_records, validate: false, on_duplicate_key_update: @columns, timestamps: true)
  end
end

#import_recordsObject



68
69
70
# File 'lib/master_data_tool/master_data.rb', line 68

def import_records
  new_records + updated_records + no_change_records
end

#loadObject



36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# File 'lib/master_data_tool/master_data.rb', line 36

def load
  csv = CSV.read(@master_data_file.path, headers: true, skip_blanks: true)
  old_records_by_id = @model_klass.all.index_by(&:id)

  csv_records_by_id = build_records_from_csv(csv, old_records_by_id)
  deleted_ids = old_records_by_id.keys - csv_records_by_id.keys

  @columns = csv.headers

  csv_records_by_id.each do |_, record|
    if record.new_record?
      @new_records << record

      next
    end

    if record.has_changes_to_save?
      @updated_records << record

      next
    end

    @no_change_records << record
  end

  deleted_ids.each do |id|
    @deleted_records << old_records_by_id[id]
  end

  @loaded = true
end

#loaded?Boolean

Returns:

  • (Boolean)


100
101
102
# File 'lib/master_data_tool/master_data.rb', line 100

def loaded?
  @loaded
end


157
158
159
160
161
162
# File 'lib/master_data_tool/master_data.rb', line 157

def print_affected_table
  return unless loaded?
  return unless affected?

  MasterDataTool::Report::PrintAffectedTableReport.new(self)
end

#table_nameObject



117
118
119
# File 'lib/master_data_tool/master_data.rb', line 117

def table_name
  @model_klass.table_name
end

#verify!(ignore_fail: false) ⇒ Object



137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
# File 'lib/master_data_tool/master_data.rb', line 137

def verify!(ignore_fail: false)
  MasterDataTool::Report::VerifyReport.new(self).tap do |report|
    scoped = @model_klass.all
    scoped = scoped.preload(preload_associations) if preload_associations
    scoped = scoped.eager_load(eager_load_associations) if eager_load_associations

    scoped.find_each do |record|
      valid = record.valid?
      report.append(MasterDataTool::Report::VerifyReport.build_verify_record_report(self, record, valid))
      next if valid
      next if ignore_fail

      e = MasterDataTool::VerifyFailed.new("[#{table_name}] id = #{record.id} is invalid")
      e.errors = record.errors

      raise e
    end
  end
end