Class: MasterDataTool::MasterData
- Inherits:
-
Object
- Object
- MasterDataTool::MasterData
- Defined in:
- lib/master_data_tool/master_data.rb
Instance Attribute Summary collapse
-
#after_count ⇒ Object
readonly
Returns the value of attribute after_count.
-
#before_count ⇒ Object
readonly
Returns the value of attribute before_count.
-
#columns ⇒ Object
readonly
Returns the value of attribute columns.
-
#deleted_records ⇒ Object
readonly
Returns the value of attribute deleted_records.
-
#master_data_file ⇒ Object
readonly
Returns the value of attribute master_data_file.
-
#model_klass ⇒ Object
readonly
Returns the value of attribute model_klass.
-
#new_records ⇒ Object
readonly
Returns the value of attribute new_records.
-
#no_change_records ⇒ Object
readonly
Returns the value of attribute no_change_records.
-
#spec_config ⇒ Object
readonly
Returns the value of attribute spec_config.
-
#updated_records ⇒ Object
readonly
Returns the value of attribute updated_records.
Class Method Summary collapse
Instance Method Summary collapse
- #affected? ⇒ Boolean
- #affected_records ⇒ Object
- #basename ⇒ Object
- #import!(dry_run: true, delete_all_ignore_foreign_key: false) ⇒ Object
- #import_records ⇒ Object
-
#initialize(spec_config, master_data_file, model_klass) ⇒ MasterData
constructor
A new instance of MasterData.
- #load ⇒ Object
- #loaded? ⇒ Boolean
- #print_affected_table ⇒ Object
- #table_name ⇒ Object
- #verify!(ignore_fail: false) ⇒ Object
Constructor Details
#initialize(spec_config, master_data_file, model_klass) ⇒ MasterData
Returns a new instance of MasterData.
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_count ⇒ Object (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_count ⇒ Object (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 |
#columns ⇒ Object (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_records ⇒ Object (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_file ⇒ Object (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_klass ⇒ Object (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_records ⇒ Object (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_records ⇒ Object (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_config ⇒ Object (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_records ⇒ Object (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
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_records ⇒ Object
72 73 74 |
# File 'lib/master_data_tool/master_data.rb', line 72 def affected_records new_records + updated_records + deleted_records end |
#basename ⇒ Object
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_records ⇒ Object
68 69 70 |
# File 'lib/master_data_tool/master_data.rb', line 68 def import_records new_records + updated_records + no_change_records end |
#load ⇒ Object
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
100 101 102 |
# File 'lib/master_data_tool/master_data.rb', line 100 def loaded? @loaded end |
#print_affected_table ⇒ Object
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_name ⇒ Object
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 |