mongoid_geospatial 1.0.0rc0
Sign up to get free protection for your applications and to get access to all the features.
- data/.document +5 -0
- data/.gitignore +49 -0
- data/.rspec +1 -0
- data/Gemfile +11 -0
- data/README.md +330 -0
- data/Rakefile +18 -0
- data/lib/mongoid_geospatial/contexts/mongo.rb +115 -0
- data/lib/mongoid_geospatial/criteria.rb +5 -0
- data/lib/mongoid_geospatial/criterion/complex.rb +19 -0
- data/lib/mongoid_geospatial/criterion/inclusion.rb +14 -0
- data/lib/mongoid_geospatial/criterion/near_spatial.rb +50 -0
- data/lib/mongoid_geospatial/criterion/within_spatial.rb +60 -0
- data/lib/mongoid_geospatial/criterion.rb +3 -0
- data/lib/mongoid_geospatial/extensions/hash.rb +22 -0
- data/lib/mongoid_geospatial/extensions/symbol.rb +46 -0
- data/lib/mongoid_geospatial/field_option.rb +16 -0
- data/lib/mongoid_geospatial/fields/line_string.rb +18 -0
- data/lib/mongoid_geospatial/fields/point.rb +51 -0
- data/lib/mongoid_geospatial/fields/polygon.rb +22 -0
- data/lib/mongoid_geospatial/finders.rb +5 -0
- data/lib/mongoid_geospatial/geospatial/core_ext.rb +27 -0
- data/lib/mongoid_geospatial/geospatial/geo_near_results.rb +140 -0
- data/lib/mongoid_geospatial/geospatial.rb +86 -0
- data/lib/mongoid_geospatial/version.rb +5 -0
- data/lib/mongoid_geospatial.rb +16 -0
- data/mongoid_geospatial.gemspec +28 -0
- data/spec/config/mongod.conf +3 -0
- data/spec/config/mongoid.yml +18 -0
- data/spec/functional/contexts/mongo_spec.rb +127 -0
- data/spec/functional/criterion/inclusion_spec.rb +356 -0
- data/spec/functional/mongoid_geospatial_spec.rb +54 -0
- data/spec/functional/spatial/geo_near_results_spec.rb +78 -0
- data/spec/models/account.rb +19 -0
- data/spec/models/acolyte.rb +9 -0
- data/spec/models/address.rb +62 -0
- data/spec/models/address_component.rb +5 -0
- data/spec/models/agent.rb +10 -0
- data/spec/models/alert.rb +5 -0
- data/spec/models/animal.rb +21 -0
- data/spec/models/answer.rb +4 -0
- data/spec/models/bar.rb +9 -0
- data/spec/models/birthday.rb +13 -0
- data/spec/models/book.rb +5 -0
- data/spec/models/business.rb +7 -0
- data/spec/models/callbacks.rb +57 -0
- data/spec/models/category.rb +13 -0
- data/spec/models/circus.rb +7 -0
- data/spec/models/comment.rb +13 -0
- data/spec/models/country_code.rb +6 -0
- data/spec/models/description.rb +11 -0
- data/spec/models/division.rb +5 -0
- data/spec/models/drug.rb +5 -0
- data/spec/models/employer.rb +5 -0
- data/spec/models/entry.rb +6 -0
- data/spec/models/event.rb +20 -0
- data/spec/models/farm.rb +10 -0
- data/spec/models/favorite.rb +6 -0
- data/spec/models/fruits.rb +11 -0
- data/spec/models/game.rb +18 -0
- data/spec/models/ghost.rb +7 -0
- data/spec/models/house.rb +4 -0
- data/spec/models/inheritance.rb +90 -0
- data/spec/models/league.rb +5 -0
- data/spec/models/location.rb +5 -0
- data/spec/models/login.rb +6 -0
- data/spec/models/membership.rb +4 -0
- data/spec/models/mixed_drink.rb +4 -0
- data/spec/models/name.rb +13 -0
- data/spec/models/namespacing.rb +11 -0
- data/spec/models/observed.rb +41 -0
- data/spec/models/override.rb +16 -0
- data/spec/models/owner.rb +6 -0
- data/spec/models/page.rb +5 -0
- data/spec/models/page_question.rb +4 -0
- data/spec/models/paranoid_post.rb +18 -0
- data/spec/models/parents.rb +32 -0
- data/spec/models/patient.rb +15 -0
- data/spec/models/person.rb +146 -0
- data/spec/models/pet.rb +7 -0
- data/spec/models/pet_owner.rb +6 -0
- data/spec/models/phone.rb +7 -0
- data/spec/models/player.rb +23 -0
- data/spec/models/post.rb +26 -0
- data/spec/models/preference.rb +9 -0
- data/spec/models/question.rb +8 -0
- data/spec/models/quiz.rb +6 -0
- data/spec/models/rating.rb +8 -0
- data/spec/models/river.rb +20 -0
- data/spec/models/role.rb +5 -0
- data/spec/models/service.rb +6 -0
- data/spec/models/shelf.rb +5 -0
- data/spec/models/slave_address_numbers.rb +14 -0
- data/spec/models/survey.rb +5 -0
- data/spec/models/tag.rb +6 -0
- data/spec/models/tracking_id_validation_history.rb +25 -0
- data/spec/models/translation.rb +5 -0
- data/spec/models/tree.rb +9 -0
- data/spec/models/user.rb +9 -0
- data/spec/models/user_account.rb +10 -0
- data/spec/models/vet_visit.rb +5 -0
- data/spec/models/video.rb +9 -0
- data/spec/models/wiki_page.rb +6 -0
- data/spec/spec_helper.rb +51 -0
- data/spec/support/authentication.rb +29 -0
- data/spec/unit/criterion/complex_spec.rb +15 -0
- data/spec/unit/criterion/inclusion_spec.rb +0 -0
- data/spec/unit/criterion/near_spatial_spec.rb +39 -0
- data/spec/unit/criterion/within_spatial_spec.rb +52 -0
- metadata +339 -0
@@ -0,0 +1,356 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Mongoid::Criterion::Inclusion do
|
4
|
+
|
5
|
+
before do
|
6
|
+
Person.delete_all
|
7
|
+
end
|
8
|
+
|
9
|
+
describe "#where" do
|
10
|
+
|
11
|
+
let(:dob) do
|
12
|
+
33.years.ago.to_date
|
13
|
+
end
|
14
|
+
|
15
|
+
let(:lunch_time) do
|
16
|
+
30.minutes.ago
|
17
|
+
end
|
18
|
+
|
19
|
+
let!(:person) do
|
20
|
+
Person.create(
|
21
|
+
:title => "Sir",
|
22
|
+
:dob => dob,
|
23
|
+
:lunch_time => lunch_time,
|
24
|
+
:age => 33,
|
25
|
+
:aliases => [ "D", "Durran" ],
|
26
|
+
:things => [ { :phone => 'HTC Incredible' } ]
|
27
|
+
)
|
28
|
+
end
|
29
|
+
|
30
|
+
context "when providing 24 character strings" do
|
31
|
+
|
32
|
+
context "when the field is not an id field" do
|
33
|
+
|
34
|
+
let(:string) do
|
35
|
+
BSON::ObjectId.new.to_s
|
36
|
+
end
|
37
|
+
|
38
|
+
let!(:person) do
|
39
|
+
Person.create(:title => string)
|
40
|
+
end
|
41
|
+
|
42
|
+
let(:from_db) do
|
43
|
+
Person.where(:title => string)
|
44
|
+
end
|
45
|
+
|
46
|
+
it "does not convert the field to a bson id" do
|
47
|
+
from_db.should == [ person ]
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
context "when providing string object ids" do
|
53
|
+
|
54
|
+
context "when providing a single id" do
|
55
|
+
|
56
|
+
let(:from_db) do
|
57
|
+
Person.where(:_id => person.id.to_s).first
|
58
|
+
end
|
59
|
+
|
60
|
+
it "returns the matching documents" do
|
61
|
+
from_db.should == person
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
context "chaining multiple wheres" do
|
67
|
+
|
68
|
+
context "when chaining on the same key" do
|
69
|
+
|
70
|
+
let(:from_db) do
|
71
|
+
Person.where(:title => "Maam").where(:title => "Sir")
|
72
|
+
end
|
73
|
+
|
74
|
+
it "overrides the previous key" do
|
75
|
+
from_db.should == [ person ]
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
context "with different criteria on the same key" do
|
80
|
+
|
81
|
+
it "merges criteria" do
|
82
|
+
Person.where(:age.gt => 30).where(:age.lt => 40).should == [person]
|
83
|
+
end
|
84
|
+
|
85
|
+
it "typecasts criteria" do
|
86
|
+
before_dob = (dob - 1.month).to_s
|
87
|
+
after_dob = (dob + 1.month).to_s
|
88
|
+
Person.where(:dob.gt => before_dob).and(:dob.lt => after_dob).should == [person]
|
89
|
+
end
|
90
|
+
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
context "with untyped criteria" do
|
95
|
+
|
96
|
+
it "typecasts integers" do
|
97
|
+
Person.where(:age => "33").should == [ person ]
|
98
|
+
end
|
99
|
+
|
100
|
+
it "typecasts datetimes" do
|
101
|
+
Person.where(:lunch_time => lunch_time.to_s).should == [ person ]
|
102
|
+
end
|
103
|
+
|
104
|
+
it "typecasts dates" do
|
105
|
+
Person.where({:dob => dob.to_s}).should == [ person ]
|
106
|
+
end
|
107
|
+
|
108
|
+
it "typecasts times with zones" do
|
109
|
+
time = lunch_time.in_time_zone("Alaska")
|
110
|
+
Person.where(:lunch_time => time).should == [ person ]
|
111
|
+
end
|
112
|
+
|
113
|
+
it "typecasts array elements" do
|
114
|
+
Person.where(:age.in => [17, "33"]).should == [ person ]
|
115
|
+
end
|
116
|
+
|
117
|
+
it "typecasts size criterion to integer" do
|
118
|
+
Person.where(:aliases.size => "2").should == [ person ]
|
119
|
+
end
|
120
|
+
|
121
|
+
it "typecasts exists criterion to boolean" do
|
122
|
+
Person.where(:score.exists => "f").should == [ person ]
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
context "with multiple complex criteria" do
|
127
|
+
|
128
|
+
before do
|
129
|
+
Person.create(:title => "Mrs", :age => 29)
|
130
|
+
Person.create(:title => "Ms", :age => 41)
|
131
|
+
end
|
132
|
+
|
133
|
+
it "returns those matching both criteria" do
|
134
|
+
Person.where(:age.gt => 30, :age.lt => 40).should == [person]
|
135
|
+
end
|
136
|
+
|
137
|
+
it "returns nothing if in and nin clauses cancel each other out" do
|
138
|
+
Person.any_in(:title => ["Sir"]).not_in(:title => ["Sir"]).should == []
|
139
|
+
end
|
140
|
+
|
141
|
+
it "returns nothing if in and nin clauses cancel each other out ordered the other way" do
|
142
|
+
Person.not_in(:title => ["Sir"]).any_in(:title => ["Sir"]).should == []
|
143
|
+
end
|
144
|
+
|
145
|
+
it "returns the intersection of in and nin clauses" do
|
146
|
+
Person.any_in(:title => ["Sir", "Mrs"]).not_in(:title => ["Mrs"]).should == [person]
|
147
|
+
end
|
148
|
+
|
149
|
+
it "returns the intersection of two in clauses" do
|
150
|
+
Person.where(:title.in => ["Sir", "Mrs"]).where(:title.in => ["Sir", "Ms"]).should == [person]
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
context "with complex criterion" do
|
155
|
+
|
156
|
+
context "#all" do
|
157
|
+
|
158
|
+
it "returns those matching an all clause" do
|
159
|
+
Person.where(:aliases.all => ["D", "Durran"]).should == [person]
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
163
|
+
context "#exists" do
|
164
|
+
|
165
|
+
it "returns those matching an exists clause" do
|
166
|
+
Person.where(:title.exists => true).should == [person]
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
context "#gt" do
|
171
|
+
|
172
|
+
it "returns those matching a gt clause" do
|
173
|
+
Person.where(:age.gt => 30).should == [person]
|
174
|
+
end
|
175
|
+
end
|
176
|
+
|
177
|
+
context "#gte" do
|
178
|
+
|
179
|
+
it "returns those matching a gte clause" do
|
180
|
+
Person.where(:age.gte => 33).should == [person]
|
181
|
+
end
|
182
|
+
end
|
183
|
+
|
184
|
+
context "#in" do
|
185
|
+
|
186
|
+
it "returns those matching an in clause" do
|
187
|
+
Person.where(:title.in => ["Sir", "Madam"]).should == [person]
|
188
|
+
end
|
189
|
+
|
190
|
+
it "allows nil" do
|
191
|
+
Person.where(:ssn.in => [nil]).should == [person]
|
192
|
+
end
|
193
|
+
end
|
194
|
+
|
195
|
+
context "#lt" do
|
196
|
+
|
197
|
+
it "returns those matching a lt clause" do
|
198
|
+
Person.where(:age.lt => 34).should == [person]
|
199
|
+
end
|
200
|
+
end
|
201
|
+
|
202
|
+
context "#lte" do
|
203
|
+
|
204
|
+
it "returns those matching a lte clause" do
|
205
|
+
Person.where(:age.lte => 33).should == [person]
|
206
|
+
end
|
207
|
+
end
|
208
|
+
|
209
|
+
context "#ne" do
|
210
|
+
|
211
|
+
it "returns those matching a ne clause" do
|
212
|
+
Person.where(:age.ne => 50).should == [person]
|
213
|
+
end
|
214
|
+
end
|
215
|
+
|
216
|
+
context "#nin" do
|
217
|
+
|
218
|
+
it "returns those matching a nin clause" do
|
219
|
+
Person.where(:title.nin => ["Esquire", "Congressman"]).should == [person]
|
220
|
+
end
|
221
|
+
end
|
222
|
+
|
223
|
+
context "#size" do
|
224
|
+
|
225
|
+
it "returns those matching a size clause" do
|
226
|
+
Person.where(:aliases.size => 2).should == [person]
|
227
|
+
end
|
228
|
+
end
|
229
|
+
|
230
|
+
context "#match" do
|
231
|
+
|
232
|
+
it "returns those matching a partial element in a list" do
|
233
|
+
Person.where(:things.matches => { :phone => "HTC Incredible" }).should == [person]
|
234
|
+
end
|
235
|
+
end
|
236
|
+
|
237
|
+
end
|
238
|
+
|
239
|
+
context "Geo Spatial Complex Where" do
|
240
|
+
|
241
|
+
let!(:home) do
|
242
|
+
[-73.98,40.77]
|
243
|
+
end
|
244
|
+
|
245
|
+
describe "#near" do
|
246
|
+
before do
|
247
|
+
Bar.delete_all
|
248
|
+
Bar.create_indexes
|
249
|
+
end
|
250
|
+
|
251
|
+
let!(:berlin) do
|
252
|
+
Bar.create(:location => [ 52.30, 13.25 ])
|
253
|
+
end
|
254
|
+
|
255
|
+
let!(:prague) do
|
256
|
+
Bar.create(:location => [ 50.5, 14.26 ])
|
257
|
+
end
|
258
|
+
|
259
|
+
let!(:paris) do
|
260
|
+
Bar.create(:location => [ 48.48, 2.20 ])
|
261
|
+
end
|
262
|
+
|
263
|
+
it "returns the documents sorted closest to furthest" do
|
264
|
+
Bar.where(:location.near => [ 41.23, 2.9 ]).should == [ paris, prague, berlin ]
|
265
|
+
end
|
266
|
+
|
267
|
+
it "returns the documents sorted closest to furthest" do
|
268
|
+
Bar.where(:location.near => {:point=>[ 41.23, 2.9 ],:max => 20}).should == [ paris, prague, berlin ]
|
269
|
+
end
|
270
|
+
|
271
|
+
it "returns the documents sorted closest to furthest" do
|
272
|
+
Bar.where(:location.near_sphere => [ 41.23, 2.9 ]).should == [ paris, prague, berlin ]
|
273
|
+
end
|
274
|
+
|
275
|
+
end
|
276
|
+
|
277
|
+
context "#within" do
|
278
|
+
|
279
|
+
context ":box, :polygon" do
|
280
|
+
before do
|
281
|
+
Bar.delete_all
|
282
|
+
Bar.create_indexes
|
283
|
+
end
|
284
|
+
|
285
|
+
let!(:berlin) do
|
286
|
+
Bar.create(:name => 'berlin', :location => [ 52.30, 13.25 ])
|
287
|
+
end
|
288
|
+
|
289
|
+
let!(:prague) do
|
290
|
+
Bar.create(:name => 'prague',:location => [ 50.5, 14.26 ])
|
291
|
+
end
|
292
|
+
|
293
|
+
let!(:paris) do
|
294
|
+
Bar.create(:name => 'prague',:location => [ 48.48, 2.20 ])
|
295
|
+
end
|
296
|
+
|
297
|
+
it "returns the documents within a box" do
|
298
|
+
Bar.where(:location.within(:box) => [[ 47, 1 ],[ 49, 3 ]]).should == [ paris ]
|
299
|
+
end
|
300
|
+
|
301
|
+
it "returns the documents within a polygon", :if => (Mongoid.master.connection.server_version >= '1.9') do
|
302
|
+
Bar.where(:location.within(:polygon) => [[ 47, 1 ],[49,1.5],[ 49, 3 ],[46,5]]).should == [ paris ]
|
303
|
+
end
|
304
|
+
|
305
|
+
it "returns the documents within a center" do
|
306
|
+
Bar.where(:location.within(:center) => [[ 47, 1 ],4]).should == [ paris ]
|
307
|
+
end
|
308
|
+
|
309
|
+
it "returns the documents within a center_sphere" do
|
310
|
+
Bar.where(:location.within(:center_sphere) => [[ 48, 2 ],0.1]).should == [ paris ]
|
311
|
+
end
|
312
|
+
|
313
|
+
end
|
314
|
+
context ":circle :center_sphere" do
|
315
|
+
before do
|
316
|
+
Bar.delete_all
|
317
|
+
Bar.create_indexes
|
318
|
+
end
|
319
|
+
let!(:mile1) do
|
320
|
+
Bar.create(:name => 'mile1', :location => [-73.997345, 40.759382])
|
321
|
+
end
|
322
|
+
|
323
|
+
let!(:mile3) do
|
324
|
+
Bar.create(:name => 'mile2', :location => [-73.927088, 40.752151])
|
325
|
+
end
|
326
|
+
|
327
|
+
let!(:mile7) do
|
328
|
+
Bar.create(:name => 'mile3', :location => [-74.0954913, 40.7161472])
|
329
|
+
end
|
330
|
+
|
331
|
+
let!(:mile11) do
|
332
|
+
Bar.create(:name => 'mile4', :location => [-74.0604951, 40.9178011])
|
333
|
+
end
|
334
|
+
|
335
|
+
it "returns the documents within a center_sphere" do
|
336
|
+
Bar.where(:location.within(:center_sphere) => {:point => home,:max => 2, :unit => :mi}).should == [ mile1 ]
|
337
|
+
end
|
338
|
+
|
339
|
+
it "returns the documents within a center_sphere" do
|
340
|
+
Bar.where(:location.within(:center_sphere) => {:point => home,:max => 4, :unit => :mi}).should include(mile3)
|
341
|
+
end
|
342
|
+
|
343
|
+
it "returns the documents within a center_sphere" do
|
344
|
+
Bar.where(:location.within(:center_sphere) => {:point => home,:max => 8, :unit => :mi}).should include(mile7)
|
345
|
+
end
|
346
|
+
|
347
|
+
it "returns the documents within a center_sphere" do
|
348
|
+
Bar.where(:location.within(:center_sphere) => {:point => home,:max => 12, :unit => :mi}).should include(mile11)
|
349
|
+
end
|
350
|
+
end
|
351
|
+
end
|
352
|
+
end
|
353
|
+
|
354
|
+
end
|
355
|
+
|
356
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Mongoid::Geospatial do
|
4
|
+
|
5
|
+
it "should instantiate with no problems" do
|
6
|
+
Bar.create!(name: "Moe's")
|
7
|
+
Bar.count.should eql(1)
|
8
|
+
end
|
9
|
+
|
10
|
+
it "should have a field mapped as point" do
|
11
|
+
bar = Bar.create!(location: [5,5])
|
12
|
+
bar.location.should be_a RGeo::Geographic::SphericalPointImpl
|
13
|
+
end
|
14
|
+
|
15
|
+
it "should accept an RGeo object" do
|
16
|
+
point = RGeo::Geographic.spherical_factory.point 1, 2
|
17
|
+
bar = Bar.create!(location: point)
|
18
|
+
bar.location.x.should be_within(0.1).of(1)
|
19
|
+
bar.location.y.should be_within(0.1).of(2)
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should calculate distance between points" do
|
23
|
+
bar = Bar.create!(location: [5,5])
|
24
|
+
bar2 = Bar.create!(location: [15,15])
|
25
|
+
bar.location.distance(bar2.location).should be_within(1).of(1561283.8)
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should calculate distance between points miles" do
|
29
|
+
pending
|
30
|
+
bar = Bar.create!(location: [5,5])
|
31
|
+
bar2 = Bar.create!(location: [15,15])
|
32
|
+
bar.location.distance(bar2.location).should be_within(1).of(1561283.8)
|
33
|
+
end
|
34
|
+
|
35
|
+
it "should calculate 3d distances by default" do
|
36
|
+
bar = Bar.create! location: [-73.77694444, 40.63861111 ]
|
37
|
+
bar2 = Bar.create! location: [-118.40, 33.94] #,:unit=>:mi, :spherical => true)
|
38
|
+
bar.location.distance(bar2.location).to_i.should be_within(1).of(2469)
|
39
|
+
end
|
40
|
+
|
41
|
+
it "should have a nice simple way to ovewrite geo factory" do
|
42
|
+
pending
|
43
|
+
bar = Bar.create!(location: [5,5])
|
44
|
+
bar2 = Bar.create!(location: [15,15])
|
45
|
+
bar.location.distance(bar2.location).should be_within(1).of(1561283.8)
|
46
|
+
end
|
47
|
+
|
48
|
+
it "should have a field mapped as polygon" do
|
49
|
+
farm = Farm.create!(area: [[5,5],[6,5],[6,6],[5,6]])
|
50
|
+
farm.area.should be_a RGeo::Geographic::SphericalPolygonImpl
|
51
|
+
end
|
52
|
+
|
53
|
+
|
54
|
+
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Mongoid::Geospatial::GeoNearResults do
|
4
|
+
before do
|
5
|
+
Bar.delete_all
|
6
|
+
Bar.create_indexes
|
7
|
+
|
8
|
+
50.times do |i|
|
9
|
+
Bar.create!(:name => i.to_s, :location => [rand(358)-179,rand(358)-179])
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
|
14
|
+
|
15
|
+
context ":paginator :array" do
|
16
|
+
let(:bars) { Bar.geo_near([1,1]) }
|
17
|
+
let(:sorted_bars) {
|
18
|
+
bars = Bar.geo_near([1,1])
|
19
|
+
bars.sort_by! {|b| b.name.to_i}
|
20
|
+
bars
|
21
|
+
}
|
22
|
+
[nil,1,2].each do |page|
|
23
|
+
it "page=#{page} should have 25" do
|
24
|
+
bars.page(page).size.should == 25
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
[1,2].each do |page|
|
29
|
+
it "modified result should keep order after pagination" do
|
30
|
+
sorted_bars.page(page).should == sorted_bars.slice((page-1)*25,25)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
{ nil => 25, 20 => 20 , 30 => 20, 50 => 0}.each do |per, total|
|
35
|
+
it "page=2 per=#{per} should have #{total}" do
|
36
|
+
bars.per(per).page(2).size.should == total
|
37
|
+
bars.page(2).per(per).size.should == total
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
it "page=3 should have 0" do
|
42
|
+
bars.page(3).size.should == 0
|
43
|
+
end
|
44
|
+
|
45
|
+
it "per=5" do
|
46
|
+
bars.per(5).size.should == 5
|
47
|
+
end
|
48
|
+
|
49
|
+
it "page=10 per=5" do
|
50
|
+
bars.per(5).page(10).should == bars[45..50]
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
|
55
|
+
context ":paginator :kaminari" do
|
56
|
+
let!(:near) {Bar.geo_near([1,1]).page(1)}
|
57
|
+
it "should have current_page" do
|
58
|
+
near.current_page.should == 1
|
59
|
+
end
|
60
|
+
|
61
|
+
it "should have num_pages" do
|
62
|
+
near.total_entries.should == 50
|
63
|
+
near.num_pages.should == 2
|
64
|
+
end
|
65
|
+
|
66
|
+
it "should have limit_value" do
|
67
|
+
near.limit_value.should == 25
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
|
72
|
+
context ":paginator :num_pages" do
|
73
|
+
it "when total=55 per=10 ,num_pages should be 6" do
|
74
|
+
5.times { |i| Bar.create(:name => i.to_s, :location => [rand(358)-179,rand(358)-179]) }
|
75
|
+
Bar.geo_near([1,1]).per(10).num_pages.should == 6
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
class Account
|
2
|
+
include Mongoid::Document
|
3
|
+
field :number, :type => String
|
4
|
+
field :balance, :type => String
|
5
|
+
field :nickname, :type => String
|
6
|
+
field :name, :type => String
|
7
|
+
key :name
|
8
|
+
|
9
|
+
embeds_many :memberships
|
10
|
+
referenced_in :creator, :class_name => "User", :foreign_key => :creator_id
|
11
|
+
referenced_in :person
|
12
|
+
references_many :alerts
|
13
|
+
references_and_referenced_in_many :agents
|
14
|
+
|
15
|
+
attr_accessible :nickname, :name
|
16
|
+
|
17
|
+
validates_presence_of :name
|
18
|
+
validates_length_of :name, :maximum => 10, :on => :create
|
19
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
class Address
|
2
|
+
include Mongoid::Document
|
3
|
+
|
4
|
+
attr_accessor :mode
|
5
|
+
|
6
|
+
field :address_type
|
7
|
+
field :number, :type => Integer
|
8
|
+
field :street
|
9
|
+
field :city
|
10
|
+
field :state
|
11
|
+
field :post_code
|
12
|
+
field :parent_title
|
13
|
+
field :services, :type => Array
|
14
|
+
field :latlng, :type => Array
|
15
|
+
key :street
|
16
|
+
embeds_many :locations
|
17
|
+
|
18
|
+
embedded_in :addressable, :polymorphic => true do
|
19
|
+
def extension
|
20
|
+
"Testing"
|
21
|
+
end
|
22
|
+
def doctor?
|
23
|
+
title == "Dr"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
accepts_nested_attributes_for :locations
|
28
|
+
|
29
|
+
referenced_in :account
|
30
|
+
|
31
|
+
scope :without_postcode, where(:postcode => nil)
|
32
|
+
named_scope :rodeo, where(:street => "Rodeo Dr") do
|
33
|
+
def mansion?
|
34
|
+
all? { |address| address.street == "Rodeo Dr" }
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
validates_presence_of :street, :on => :update
|
39
|
+
validates_format_of :street, :with => /\D/, :allow_nil => true
|
40
|
+
|
41
|
+
def set_parent=(set = false)
|
42
|
+
self.parent_title = addressable.title if set
|
43
|
+
end
|
44
|
+
|
45
|
+
def <=>(other)
|
46
|
+
street <=> other.street
|
47
|
+
end
|
48
|
+
|
49
|
+
class << self
|
50
|
+
def california
|
51
|
+
where(:state => "CA")
|
52
|
+
end
|
53
|
+
|
54
|
+
def homes
|
55
|
+
where(:address_type => "Home")
|
56
|
+
end
|
57
|
+
|
58
|
+
def streets
|
59
|
+
all.map(&:street)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
class Animal
|
2
|
+
include Mongoid::Document
|
3
|
+
field :name
|
4
|
+
field :tags, :type => Array
|
5
|
+
key :name
|
6
|
+
|
7
|
+
embedded_in :person
|
8
|
+
embedded_in :circus
|
9
|
+
|
10
|
+
validates_format_of :name, :without => /\$\$\$/
|
11
|
+
|
12
|
+
accepts_nested_attributes_for :person
|
13
|
+
|
14
|
+
def tag_list
|
15
|
+
tags.join(", ")
|
16
|
+
end
|
17
|
+
|
18
|
+
def tag_list=(_tag_list)
|
19
|
+
self.tags = _tag_list.split(",").map(&:strip)
|
20
|
+
end
|
21
|
+
end
|
data/spec/models/bar.rb
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
class Birthday
|
2
|
+
include Mongoid::Document
|
3
|
+
field :title
|
4
|
+
field :date, :type => Date
|
5
|
+
embedded_in :owner, :inverse_of => :birthdays
|
6
|
+
|
7
|
+
def self.each_day(start_date, end_date)
|
8
|
+
groups = only(:date).asc(:date).where(:date.gte => start_date, :date.lte => end_date).group
|
9
|
+
groups.each do |date, group|
|
10
|
+
yield(date, group)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
data/spec/models/book.rb
ADDED