Skip to content

Commit 85c1236

Browse files
authored
Merge pull request #182 from coderdojo-japan/has-many-dojo-event-services
`has_one` -> `has_many` between Dojo and DojoEventService
2 parents dc46ab7 + fe08d35 commit 85c1236

File tree

4 files changed

+57
-51
lines changed

4 files changed

+57
-51
lines changed

app/models/dojo.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ class Dojo < ApplicationRecord
55
NUM_OF_JAPAN_DOJOS = Dojo.count.to_s
66

77
belongs_to :prefecture
8-
has_one :dojo_event_service, dependent: :destroy
9-
has_many :event_histories, dependent: :destroy
8+
has_many :dojo_event_services, dependent: :destroy
9+
has_many :event_histories, dependent: :destroy
1010

1111
serialize :tags
1212
default_scope -> { order(order: :asc) }

lib/statistics/aggregation.rb

Lines changed: 39 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@ module Statistics
22
class Aggregation
33
class << self
44
def run(date:)
5-
cnps_dojos = Dojo.joins(:dojo_event_service).where(dojo_event_services: { name: :connpass }).to_a
6-
drkp_dojos = Dojo.joins(:dojo_event_service).where(dojo_event_services: { name: :doorkeeper }).to_a
7-
fsbk_dojos = Dojo.joins(:dojo_event_service).where(dojo_event_services: { name: :facebook }).to_a
5+
cnps_dojos = Dojo.joins(:dojo_event_services).where(dojo_event_services: { name: :connpass }).to_a
6+
drkp_dojos = Dojo.joins(:dojo_event_services).where(dojo_event_services: { name: :doorkeeper }).to_a
7+
fsbk_dojos = Dojo.joins(:dojo_event_services).where(dojo_event_services: { name: :facebook }).to_a
88

99
Connpass.run(cnps_dojos, date)
1010
Doorkeeper.run(drkp_dojos, date)
@@ -21,17 +21,19 @@ def run(dojos, date)
2121
}
2222

2323
dojos.each do |dojo|
24-
cnps.fetch_events(params.merge(series_id: dojo.dojo_event_service.group_id)).each do |e|
25-
next unless e.dig('series', 'id').to_s == dojo.dojo_event_service.group_id
24+
dojo.dojo_event_services.each do |dojo_event_service|
25+
cnps.fetch_events(params.merge(series_id: dojo_event_service.group_id)).each do |e|
26+
next unless e.dig('series', 'id').to_s == dojo_event_service.group_id
2627

27-
EventHistory.create!(dojo_id: dojo.id,
28-
dojo_name: dojo.name,
29-
service_name: dojo.dojo_event_service.name,
30-
service_group_id: dojo.dojo_event_service.group_id,
31-
event_id: e['event_id'],
32-
event_url: e['event_url'],
33-
participants: e['accepted'],
34-
evented_at: Time.zone.parse(e['started_at']))
28+
EventHistory.create!(dojo_id: dojo.id,
29+
dojo_name: dojo.name,
30+
service_name: dojo_event_service.name,
31+
service_group_id: dojo_event_service.group_id,
32+
event_id: e['event_id'],
33+
event_url: e['event_url'],
34+
participants: e['accepted'],
35+
evented_at: Time.zone.parse(e['started_at']))
36+
end
3537
end
3638
end
3739
end
@@ -48,17 +50,19 @@ def run(dojos, date)
4850
}
4951

5052
dojos.each do |dojo|
51-
drkp.fetch_events(params.merge(group_id: dojo.dojo_event_service.group_id)).each do |e|
52-
next unless e['group'].to_s == dojo.dojo_event_service.group_id
53+
dojo.dojo_event_services.each do |dojo_event_service|
54+
drkp.fetch_events(params.merge(group_id: dojo_event_service.group_id)).each do |e|
55+
next unless e['group'].to_s == dojo_event_service.group_id
5356

54-
EventHistory.create!(dojo_id: dojo.id,
55-
dojo_name: dojo.name,
56-
service_name: dojo.dojo_event_service.name,
57-
service_group_id: dojo.dojo_event_service.group_id,
58-
event_id: e['id'],
59-
event_url: e['public_url'],
60-
participants: e['participants'],
61-
evented_at: Time.zone.parse(e['starts_at']))
57+
EventHistory.create!(dojo_id: dojo.id,
58+
dojo_name: dojo.name,
59+
service_name: dojo_event_service.name,
60+
service_group_id: dojo_event_service.group_id,
61+
event_id: e['id'],
62+
event_url: e['public_url'],
63+
participants: e['participants'],
64+
evented_at: Time.zone.parse(e['starts_at']))
65+
end
6266
end
6367
end
6468
end
@@ -75,17 +79,19 @@ def run(dojos, date)
7579
}
7680

7781
dojos.each do |dojo|
78-
fsbk.fetch_events(params.merge(group_id: dojo.dojo_event_service.group_id)).each do |e|
79-
next unless e.dig('owner', 'id') == dojo.dojo_event_service.group_id
82+
dojo.dojo_event_services.each do |dojo_event_service|
83+
fsbk.fetch_events(params.merge(group_id: dojo_event_service.group_id)).each do |e|
84+
next unless e.dig('owner', 'id') == dojo_event_service.group_id
8085

81-
EventHistory.create!(dojo_id: dojo.id,
82-
dojo_name: dojo.name,
83-
service_name: dojo.dojo_event_service.name,
84-
service_group_id: dojo.dojo_event_service.group_id,
85-
event_id: e['id'],
86-
event_url: "https://www.facebook.com/events/#{e['id']}",
87-
participants: e['attending_count'],
88-
evented_at: Time.zone.parse(e['start_time']))
86+
EventHistory.create!(dojo_id: dojo.id,
87+
dojo_name: dojo.name,
88+
service_name: dojo_event_service.name,
89+
service_group_id: dojo_event_service.group_id,
90+
event_id: e['id'],
91+
event_url: "https://www.facebook.com/events/#{e['id']}",
92+
participants: e['attending_count'],
93+
evented_at: Time.zone.parse(e['start_time']))
94+
end
8995
end
9096
end
9197
end

lib/statistics/client.rb

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -121,10 +121,14 @@ def initialize
121121
def fetch_events(group_id:, since_at: nil, until_at: nil)
122122
params = {
123123
fields: %i(attending_count start_time owner),
124-
limit: 100,
125-
since: since_at,
126-
until: until_at
127-
}.compact
124+
limit: 100
125+
}.tap do |h|
126+
# @note FacebookのGraph APIはPDTがタイムゾーンとなっており、
127+
# JST<->PDTのオフセット8時間を追加した時刻をパラメータとする必要がある
128+
# @see https://github.com/coderdojo-japan/coderdojo.jp/pull/182#discussion_r148935458
129+
h[:since] = since_at.since(8.hours).to_i if since_at
130+
h[:until] = until_at.since(8.hours).to_i if until_at
131+
end
128132

129133
events = []
130134

lib/tasks/dojo_event_services.rake

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -19,23 +19,19 @@ namespace :dojo_event_services do
1919
next
2020
end
2121

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_id'))
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_id'], changes]
22+
dojo_event_service = dojo.dojo_event_services.find_or_initialize_by(des)
23+
if dojo_event_service.changed?
24+
changes = dojo_event_service.changes
25+
new_record = dojo_event_service.new_record?
26+
dojo_event_service.save!
27+
(new_record ? result[:inserted] : result[:updated]) << ["#{des['dojo_id']}:#{dojo_event_service.id}", changes]
3328
else
34-
result[:kept] << [des['dojo_id']]
29+
result[:kept] << ["#{des['dojo_id']}:#{dojo_event_service.id}"]
3530
end
3631
end
3732

3833
# Dump result
34+
result[:skipped] = result[:skipped].uniq {|s| s.first }
3935
result.except!(:kept, :skipped) unless ENV.key?('DEBUG')
4036
sorted = result.sort_by {|_, v| v.length }.reverse.to_h
4137
puts

0 commit comments

Comments
 (0)