|
| 1 | +namespace :dojo_event_services do |
| 2 | + desc '現在のyamlファイルを元にデータベースを更新します' |
| 3 | + task upsert: :environment do |
| 4 | + puts 'Task as `dojo_event_services:upsert` starting...' |
| 5 | + |
| 6 | + result = { inserted: [], updated: [], kept: [], skipped: [] } |
| 7 | + |
| 8 | + list = YAML.load_file(Rails.root.join('db','dojo_event_services.yaml')) |
| 9 | + list.each do |des| |
| 10 | + unless DojoEventService.names.keys.include?(des['name']) |
| 11 | + event_names = DojoEventService.names.keys.map {|s| "`#{s}`" } |
| 12 | + result[:skipped] << [des['dojo_name'], "Not used #{event_names.join(' or ')}"] |
| 13 | + next |
| 14 | + end |
| 15 | + |
| 16 | + dojo = Dojo.find_by(name: des['dojo_name']) |
| 17 | + unless dojo |
| 18 | + result[:skipped] << [des['dojo_name'], 'Not found record in `dojos` table'] |
| 19 | + next |
| 20 | + end |
| 21 | + |
| 22 | + insert = false |
| 23 | + unless dojo.dojo_event_service |
| 24 | + dojo.build_dojo_event_service |
| 25 | + insert = true |
| 26 | + end |
| 27 | + |
| 28 | + dojo.dojo_event_service.assign_attributes(des.except('dojo_name')) |
| 29 | + if dojo.dojo_event_service.changed? |
| 30 | + changes = dojo.dojo_event_service.changes |
| 31 | + dojo.dojo_event_service.save! |
| 32 | + (insert ? result[:inserted] : result[:updated]) << [des['dojo_name'], changes] |
| 33 | + else |
| 34 | + result[:kept] << [des['dojo_name']] |
| 35 | + end |
| 36 | + end |
| 37 | + |
| 38 | + # Dump result |
| 39 | + sorted = result.sort_by {|_, v| v.length }.reverse.to_h |
| 40 | + puts |
| 41 | + sorted.each do |k, v| |
| 42 | + puts "#{k.to_s.camelcase}: #{v.length}" |
| 43 | + v.each {|x| puts " #{x.join(': ')}"} |
| 44 | + end |
| 45 | + end |
| 46 | +end |
0 commit comments