Skip to content

Commit 622e1e3

Browse files
committed
Add geolocation
1 parent 48117ae commit 622e1e3

File tree

8 files changed

+237
-3
lines changed

8 files changed

+237
-3
lines changed

Gemfile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ gem "non-stupid-digest-assets"
3131
gem "react-rails" # https://github.com/reactjs/react-rails
3232
gem "sass-rails"
3333
gem "uglifier"
34+
gem "geocoder"
3435

3536
source "https://rails-assets.org" do
3637
gem "rails-assets-bootswatch-sass", "< 4.0.0"

Gemfile.lock

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@ GEM
110110
faraday-net_http (1.0.1)
111111
faraday-net_http_persistent (1.2.0)
112112
ffi (1.16.3)
113+
geocoder (1.8.2)
113114
globalid (1.2.1)
114115
activesupport (>= 6.1)
115116
i18n (1.14.1)
@@ -277,6 +278,7 @@ DEPENDENCIES
277278
factory_bot_rails (~> 6.2.0)
278279
faker (~> 2.18.0)
279280
faraday (~> 1.4.3)
281+
geocoder
280282
jquery-rails
281283
kaminari (~> 1.2.2)
282284
listen (~> 3.3)

app/jobs/generate_data_job.rb

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,14 @@ def perform(data_generation_loop_size = 100)
77
Vaccination.delete_all
88

99
shelters = 100.times.map do
10+
location = ANIMAL_SHELTERS.sample[:coordinates].sample
1011
Shelter.create!(
1112
name: Faker::Company.name,
1213
address: Faker::Address.street_address,
1314
phone: Faker::PhoneNumber.phone_number,
14-
email: Faker::Internet.email
15+
email: Faker::Internet.email,
16+
latitude: location[:latitude],
17+
longitude: location[:longitude],
1518
)
1619
end
1720

@@ -37,6 +40,8 @@ def perform(data_generation_loop_size = 100)
3740
adoption_date = nil
3841
adoption_date = Faker::Time.between(from: timestamp, to: Date.today) if rand(0..10) < 5
3942

43+
shelter = shelters.sample
44+
4045
Pet.new(
4146
created_at: timestamp,
4247
updated_at: timestamp,
@@ -64,7 +69,9 @@ def perform(data_generation_loop_size = 100)
6469
date_of_birth: Faker::Date.between(from: '2008-01-01', to: '2023-01-01'),
6570
arrival_date: Faker::Date.between(from: '2023-01-01', to: Date.today),
6671
adoption_date: adoption_date, # Assuming the pet is not yet adopted
67-
shelter_id: shelters.sample.id # Randomly assign a shelter from existing ones
72+
shelter_id: shelter.id, # Randomly assign a shelter from existing ones
73+
latitude: shelter.latitude,
74+
longitude: shelter.longitude,
6875
).attributes.except('id')
6976
end
7077
pet_ids = Pet.insert_all(pets, returning: [:id]).rows.flatten
@@ -89,5 +96,8 @@ def perform(data_generation_loop_size = 100)
8996
raise "Failed to populate pet_vaccinations" if PetVaccination.count == 0
9097

9198
end
99+
100+
101+
92102
end
93103
end

app/models/pet.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
class Pet < ApplicationRecord
2+
geocoded_by :address
3+
24
belongs_to :shelter
35
has_many :adoption_applications
46
has_many :pet_vaccinations

app/models/shelter.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
class Shelter < ApplicationRecord
2+
geocoded_by :address
3+
24
has_many :pets
35

46
validates :name, presence: true

config/initializers/geocoder.rb

Lines changed: 205 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,205 @@
1+
BIGGEST_CITIES = [
2+
{
3+
"name": "Warsaw",
4+
"latitude": 52.2297,
5+
"longitude": 21.0122
6+
},
7+
{
8+
"name": "Kraków",
9+
"latitude": 50.0647,
10+
"longitude": 19.9450
11+
},
12+
{
13+
"name": "Łódź",
14+
"latitude": 51.7592,
15+
"longitude": 19.4558
16+
},
17+
{
18+
"name": "Wrocław",
19+
"latitude": 51.1079,
20+
"longitude": 17.0385
21+
},
22+
{
23+
"name": "Poznań",
24+
"latitude": 52.4080,
25+
"longitude": 16.9335
26+
},
27+
{
28+
"name": "Gdańsk",
29+
"latitude": 54.3520,
30+
"longitude": 18.6466
31+
},
32+
{
33+
"name": "Szczecin",
34+
"latitude": 53.4285,
35+
"longitude": 14.5528
36+
},
37+
{
38+
"name": "Bydgoszcz",
39+
"latitude": 53.1235,
40+
"longitude": 18.0084
41+
},
42+
{
43+
"name": "Lublin",
44+
"latitude": 51.2465,
45+
"longitude": 22.5684
46+
},
47+
{
48+
"name": "Katowice",
49+
"latitude": 50.2649,
50+
"longitude": 19.0238
51+
}
52+
].freeze
53+
54+
ANIMAL_SHELTERS = [
55+
{
56+
"city": "Warsaw",
57+
"coordinates": [
58+
{"latitude": 52.2315, "longitude": 21.0068},
59+
{"latitude": 52.2303, "longitude": 21.0205},
60+
{"latitude": 52.2392, "longitude": 21.0121},
61+
{"latitude": 52.2347, "longitude": 21.0259},
62+
{"latitude": 52.2289, "longitude": 21.0107},
63+
{"latitude": 52.2325, "longitude": 21.0034},
64+
{"latitude": 52.2276, "longitude": 21.0142},
65+
{"latitude": 52.2384, "longitude": 21.0196},
66+
{"latitude": 52.2361, "longitude": 21.0098},
67+
{"latitude": 52.2337, "longitude": 21.0173}
68+
]
69+
},
70+
{
71+
"city": "Kraków",
72+
"coordinates": [
73+
{"latitude": 50.0682, "longitude": 19.9528},
74+
{"latitude": 50.0614, "longitude": 19.9615},
75+
{"latitude": 50.0697, "longitude": 19.9456},
76+
{"latitude": 50.0653, "longitude": 19.9672},
77+
{"latitude": 50.0731, "longitude": 19.9498},
78+
{"latitude": 50.0648, "longitude": 19.9556},
79+
{"latitude": 50.0725, "longitude": 19.9643},
80+
{"latitude": 50.0670, "longitude": 19.9510},
81+
{"latitude": 50.0629, "longitude": 19.9596},
82+
{"latitude": 50.0704, "longitude": 19.9439}
83+
]
84+
},
85+
{
86+
"city": "Łódź",
87+
"coordinates": [
88+
{"latitude": 51.7559, "longitude": 19.4607},
89+
{"latitude": 51.7501, "longitude": 19.4688},
90+
{"latitude": 51.7584, "longitude": 19.4529},
91+
{"latitude": 51.7539, "longitude": 19.4750},
92+
{"latitude": 51.7617, "longitude": 19.4576},
93+
{"latitude": 51.7534, "longitude": 19.4634},
94+
{"latitude": 51.7601, "longitude": 19.4715},
95+
{"latitude": 51.7556, "longitude": 19.4582},
96+
{"latitude": 51.7515, "longitude": 19.4667},
97+
{"latitude": 51.7590, "longitude": 19.4506}
98+
]
99+
},
100+
{
101+
"city": "Wrocław",
102+
"coordinates": [
103+
{"latitude": 51.0978, "longitude": 17.0326},
104+
{"latitude": 51.1056, "longitude": 17.0413},
105+
{"latitude": 51.0989, "longitude": 17.0254},
106+
{"latitude": 51.1033, "longitude": 17.0369},
107+
{"latitude": 51.0955, "longitude": 17.0449},
108+
{"latitude": 51.1022, "longitude": 17.0309},
109+
{"latitude": 51.0967, "longitude": 17.0389},
110+
{"latitude": 51.1044, "longitude": 17.0274},
111+
{"latitude": 51.0999, "longitude": 17.0349},
112+
{"latitude": 51.1077, "longitude": 17.0436}
113+
]
114+
},
115+
{
116+
"city": "Poznań",
117+
"coordinates": [
118+
{"latitude": 52.4042, "longitude": 16.9427},
119+
{"latitude": 52.3998, "longitude": 16.9508},
120+
{"latitude": 52.4075, "longitude": 16.9349},
121+
{"latitude": 52.4029, "longitude": 16.9465},
122+
{"latitude": 52.4107, "longitude": 16.9291},
123+
{"latitude": 52.4034, "longitude": 16.9350},
124+
{"latitude": 52.4091, "longitude": 16.9524},
125+
{"latitude": 52.4046, "longitude": 16.9392},
126+
{"latitude": 52.4001, "longitude": 16.9477},
127+
{"latitude": 52.4078, "longitude": 16.9318}
128+
]
129+
},
130+
{
131+
"city": "Gdańsk",
132+
"coordinates": [
133+
{"latitude": 54.3574, "longitude": 18.6520},
134+
{"latitude": 54.3529, "longitude": 18.6613},
135+
{"latitude": 54.3607, "longitude": 18.6453},
136+
{"latitude": 54.3553, "longitude": 18.6568},
137+
{"latitude": 54.3475, "longitude": 18.6648},
138+
{"latitude": 54.3542, "longitude": 18.6508},
139+
{"latitude": 54.3487, "longitude": 18.6593},
140+
{"latitude": 54.3564, "longitude": 18.6478},
141+
{"latitude": 54.3519, "longitude": 18.6563},
142+
{"latitude": 54.3596, "longitude": 18.6443}
143+
]
144+
},
145+
{
146+
"city": "Szczecin",
147+
"coordinates": [
148+
{"latitude": 53.4321, "longitude": 14.5619},
149+
{"latitude": 53.4277, "longitude": 14.5700},
150+
{"latitude": 53.4354, "longitude": 14.5541},
151+
{"latitude": 53.4308, "longitude": 14.5657},
152+
{"latitude": 53.4386, "longitude": 14.5483},
153+
{"latitude": 53.4313, "longitude": 14.5542},
154+
{"latitude": 53.4370, "longitude": 14.5716},
155+
{"latitude": 53.4324, "longitude": 14.5584},
156+
{"latitude": 53.4279, "longitude": 14.5669},
157+
{"latitude": 53.4356, "longitude": 14.5510}
158+
]
159+
},
160+
{
161+
"city": "Bydgoszcz",
162+
"coordinates": [
163+
{"latitude": 53.1260, "longitude": 18.0142},
164+
{"latitude": 53.1205, "longitude": 18.0223},
165+
{"latitude": 53.1282, "longitude": 18.0064},
166+
{"latitude": 53.1236, "longitude": 18.0179},
167+
{"latitude": 53.1314, "longitude": 18.0005},
168+
{"latitude": 53.1241, "longitude": 18.0064},
169+
{"latitude": 53.1298, "longitude": 18.0238},
170+
{"latitude": 53.1252, "longitude": 18.0106},
171+
{"latitude": 53.1207, "longitude": 18.0187},
172+
{"latitude": 53.1284, "longitude": 18.0028}
173+
]
174+
},
175+
{
176+
"city": "Lublin",
177+
"coordinates": [
178+
{"latitude": 51.2421, "longitude": 22.5738},
179+
{"latitude": 51.2376, "longitude": 22.5819},
180+
{"latitude": 51.2453, "longitude": 22.5660},
181+
{"latitude": 51.2407, "longitude": 22.5775},
182+
{"latitude": 51.2485, "longitude": 22.5601},
183+
{"latitude": 51.2412, "longitude": 22.5660},
184+
{"latitude": 51.2469, "longitude": 22.5834},
185+
{"latitude": 51.2423, "longitude": 22.5702},
186+
{"latitude": 51.2378, "longitude": 22.5787},
187+
{"latitude": 51.2455, "longitude": 22.5618}
188+
]
189+
},
190+
{
191+
"city": "Katowice",
192+
"coordinates": [
193+
{"latitude": 50.2695, "longitude": 19.0272},
194+
{"latitude": 50.2629, "longitude": 19.0365},
195+
{"latitude": 50.2707, "longitude": 19.0205},
196+
{"latitude": 50.2661, "longitude": 19.0321},
197+
{"latitude": 50.2739, "longitude": 19.0147},
198+
{"latitude": 50.2666, "longitude": 19.0206},
199+
{"latitude": 50.2723, "longitude": 19.0380},
200+
{"latitude": 50.2678, "longitude": 19.0258},
201+
{"latitude": 50.2633, "longitude": 19.0343},
202+
{"latitude": 50.2710, "longitude": 19.0185}
203+
]
204+
}
205+
].freeze
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
class AddGeolocation < ActiveRecord::Migration[6.1]
2+
def change
3+
add_column :pets, :latitude, :float
4+
add_column :pets, :longitude, :float
5+
add_column :shelters, :latitude, :float
6+
add_column :shelters, :longitude, :float
7+
end
8+
end

db/schema.rb

Lines changed: 5 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)