Skip to content

Commit 7b554dd

Browse files
committed
#395 dojo_event_services:upsert の修正(レビュー指摘事項反映+処理見直し) + RSpec 修正
1 parent f7b3048 commit 7b554dd

File tree

2 files changed

+23
-15
lines changed

2 files changed

+23
-15
lines changed

lib/tasks/dojo_event_services.rake

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ namespace :dojo_event_services do
22
desc '現在のyamlファイルを元にデータベースを更新します'
33
task upsert: :environment do
44
result = { inserted: [], updated: [], deleted: [], kept: [], skipped: [] }
5+
reserved_ids = []
56

67
list = YAML.load_file(Rails.root.join('db','dojo_event_services.yaml'))
78
list.each do |des|
@@ -19,13 +20,6 @@ namespace :dojo_event_services do
1920
# 比較対象は URL を除く dojo_id, name, group_id
2021
url = des.delete('url')
2122
dojo_event_service = dojo.dojo_event_services.find_or_initialize_by(des)
22-
overlapped = dojo.dojo_event_services.where(des).where.not(id: dojo_event_service.id)
23-
if overlapped.present?
24-
overlapped.each do |d|
25-
result[:deleted] << ["#{d.dojo_id}:#{d.id}"]
26-
end
27-
overlapped.destroy_all
28-
end
2923
dojo_event_service.url = url
3024
if dojo_event_service.changed?
3125
changes = dojo_event_service.changes
@@ -35,6 +29,12 @@ namespace :dojo_event_services do
3529
else
3630
result[:kept] << ["#{des['dojo_id']}:#{dojo_event_service.id}"]
3731
end
32+
reserved_ids << dojo_event_service.id
33+
end
34+
35+
DojoEventService.where.not(id: reserved_ids).find_each do |d|
36+
result[:deleted] << ["#{d.dojo_id}:#{d.id}"]
37+
d.destroy
3838
end
3939

4040
# Dump result

spec/lib/tasks/dojo_event_services_spec.rb

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020
@dojo_3 = create(:dojo, name: 'dojo_3', email: 'mail_3@test', tags: %w(Scratch ラズベリーパイ Webサイト), description: '月1回開催', prefecture_id: 13)
2121

2222
create(:dojo_event_service, dojo_id: @dojo_1.id, name: :doorkeeper, group_id: '10001', url: 'https://coder-dojo-11.doorkeeper.jp/')
23-
create(:dojo_event_service, dojo_id: @dojo_1.id, name: :doorkeeper, group_id: '10002', url: 'https://coder-dojo-12.doorkeeper.jp/abc')
2423
create(:dojo_event_service, dojo_id: @dojo_1.id, name: :doorkeeper, group_id: '10002', url: 'https://coder-dojo-12.doorkeeper.jp/')
2524
create(:dojo_event_service, dojo_id: @dojo_2.id, name: :connpass, group_id: '20001', url: 'https://coder-dojo-21.connpass.jp/')
2625
end
@@ -29,43 +28,52 @@
2928

3029
it '単純追加' do
3130
allow(YAML).to receive(:load_file).and_return([
32-
{ 'dojo_id' => @dojo_3.id, "name" => 'facebook', 'group_id' => '30001', 'url' => 'https://coder-dojo-31.facebook.com/' }
31+
{ 'dojo_id' => @dojo_1.id, "name" => 'doorkeeper', 'group_id' => '10001', 'url' => 'https://coder-dojo-11.doorkeeper.jp/' },
32+
{ 'dojo_id' => @dojo_1.id, "name" => 'doorkeeper', 'group_id' => '10002', 'url' => 'https://coder-dojo-12.doorkeeper.jp/' },
33+
{ 'dojo_id' => @dojo_2.id, "name" => 'connpass', 'group_id' => '20001', 'url' => 'https://coder-dojo-21.connpass.jp/' },
34+
{ 'dojo_id' => @dojo_3.id, "name" => 'facebook', 'group_id' => '30001', 'url' => 'https://coder-dojo-31.facebook.com/' }
3335
])
3436

3537
# before
36-
expect(DojoEventService.count).to eq(4)
38+
expect(DojoEventService.count).to eq(3)
3739

3840
# exec
3941
expect(@rake[task].invoke).to be_truthy
4042

4143
# after
42-
expect(DojoEventService.count).to eq(5)
44+
expect(DojoEventService.count).to eq(4)
4345
new_records = DojoEventService.where(dojo_id: @dojo_3.id, name: :facebook, group_id: '30001')
4446
expect(new_records.count).to eq(1)
4547
expect(new_records.first.url).to eq('https://coder-dojo-31.facebook.com/')
4648
end
4749

4850
it '単純更新' do
4951
allow(YAML).to receive(:load_file).and_return([
50-
{ 'dojo_id' => @dojo_2.id, "name" => 'connpass', 'group_id' => '20001', 'url' => 'https://coder-dojo-21.connpass.jp/zzz' }
52+
{ 'dojo_id' => @dojo_1.id, "name" => 'doorkeeper', 'group_id' => '10001', 'url' => 'https://coder-dojo-11.doorkeeper.jp/' },
53+
{ 'dojo_id' => @dojo_1.id, "name" => 'doorkeeper', 'group_id' => '10002', 'url' => 'https://coder-dojo-12.doorkeeper.jp/' },
54+
{ 'dojo_id' => @dojo_2.id, "name" => 'connpass', 'group_id' => '20001', 'url' => 'https://coder-dojo-21.connpass.jp/zzz' }
5155
])
5256

5357
# before
54-
expect(DojoEventService.count).to eq(4)
58+
expect(DojoEventService.count).to eq(3)
5559

5660
# exec
5761
expect(@rake[task].invoke).to be_truthy
5862

5963
# after
60-
expect(DojoEventService.count).to eq(4)
64+
expect(DojoEventService.count).to eq(3)
6165
mod_records = DojoEventService.where(dojo_id: @dojo_2.id, name: :connpass, group_id: '20001')
6266
expect(mod_records.count).to eq(1)
6367
expect(mod_records.first.url).to eq('https://coder-dojo-21.connpass.jp/zzz')
6468
end
6569

6670
it '余剰データ削除 & 更新' do
71+
create(:dojo_event_service, dojo_id: @dojo_1.id, name: :doorkeeper, group_id: '10002', url: 'https://coder-dojo-12.doorkeeper.jp/abc')
72+
6773
allow(YAML).to receive(:load_file).and_return([
68-
{ 'dojo_id' => @dojo_1.id, "name" => 'doorkeeper', 'group_id' => '10002', 'url' => 'https://coder-dojo-12.doorkeeper.jp/12345' }
74+
{ 'dojo_id' => @dojo_1.id, "name" => 'doorkeeper', 'group_id' => '10001', 'url' => 'https://coder-dojo-11.doorkeeper.jp/' },
75+
{ 'dojo_id' => @dojo_1.id, "name" => 'doorkeeper', 'group_id' => '10002', 'url' => 'https://coder-dojo-12.doorkeeper.jp/12345' },
76+
{ 'dojo_id' => @dojo_2.id, "name" => 'connpass', 'group_id' => '20001', 'url' => 'https://coder-dojo-21.connpass.jp/' }
6977
])
7078

7179
# before

0 commit comments

Comments
 (0)