has_distance 1.0.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.rdoc +66 -4
- data/VERSION +1 -1
- data/has_distance.gemspec +6 -7
- data/lib/has_distance/distance.rb +8 -0
- data/spec/has_distance_spec.rb +12 -0
- data/spec/support/test.db +0 -0
- metadata +71 -109
data/README.rdoc
CHANGED
@@ -1,11 +1,73 @@
|
|
1
1
|
= has_distance
|
2
2
|
|
3
|
-
A Ruby gem to add
|
4
|
-
has_distance is used for latitude/longitude distance lookup.
|
5
|
-
It also works with SQLite
|
3
|
+
A Ruby gem to add distance values to your ActiveRecord Model records.
|
6
4
|
|
7
|
-
|
5
|
+
has_distance is used to return nearby records given the records latitude/longitude as its origin.
|
8
6
|
|
7
|
+
A big plus as it also works with SQLite.
|
8
|
+
|
9
|
+
== Configure
|
10
|
+
|
11
|
+
Install the gem:
|
12
|
+
|
13
|
+
gem install has_distance
|
14
|
+
|
15
|
+
In your Gemfile add it:
|
16
|
+
|
17
|
+
gem 'has_distance'
|
18
|
+
|
19
|
+
From the command line install via bundle:
|
20
|
+
|
21
|
+
bundle install
|
22
|
+
|
23
|
+
Your ActiveRecord Model should have has_distance, for example:
|
24
|
+
|
25
|
+
class Store < ActiveRecord::Base
|
26
|
+
has_distance :distance
|
27
|
+
end
|
28
|
+
|
29
|
+
has_distance supports the following fields for configuration:
|
30
|
+
|
31
|
+
* column_name # => Default 'distance'
|
32
|
+
* lat_name # => Default 'latitude'
|
33
|
+
* lng_name # => Default 'longitude'
|
34
|
+
* units # => Default :miles, possible values are: :miles, :kms, :nms
|
35
|
+
* distance # => Default 20
|
36
|
+
* limit # => Default 12
|
37
|
+
|
38
|
+
has_distance can be configured with a block, for example:
|
39
|
+
|
40
|
+
class Store < ActiveRecord::Base
|
41
|
+
has_distance :distance do |config|
|
42
|
+
config.lat_name = 'lat'
|
43
|
+
config.lng_name = 'lng'
|
44
|
+
config.units = :kms
|
45
|
+
config.distance = 3
|
46
|
+
config.limit = 6
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
|
51
|
+
== Actual Usage
|
52
|
+
|
53
|
+
To use has_distance your database table should have two fields, one for latitude and the second for longitude.
|
54
|
+
|
55
|
+
has_distance will provide an instance method called 'nearby'.
|
56
|
+
|
57
|
+
Example:
|
58
|
+
|
59
|
+
Store.first.nearby # Would return nearby stores based on the first store's origin, latitude & longitude.
|
60
|
+
|
61
|
+
Store.first.nearby.each do |store|
|
62
|
+
# has_distance uses the column_name given in the configuration for distance
|
63
|
+
# In this case :distance was given, store.distance will return the actual distance away from the first store
|
64
|
+
store.distance
|
65
|
+
end
|
66
|
+
|
67
|
+
Store.first.nearby(limit: 3) # => will limit nearby results to 3
|
68
|
+
Store.first.nearby.limit(3) # => will also limit nearby results to 3
|
69
|
+
|
70
|
+
Store.first.nearby(distance: 1) # => will limit nearby results to distance less than equal to 1
|
9
71
|
|
10
72
|
== Contributing to has_distance
|
11
73
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.
|
1
|
+
1.1.0
|
data/has_distance.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{has_distance}
|
8
|
-
s.version = "1.
|
8
|
+
s.version = "1.1.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
-
s.authors = [
|
12
|
-
s.date = %q{2011-
|
11
|
+
s.authors = [%q{Fernando Barajas}]
|
12
|
+
s.date = %q{2011-09-24}
|
13
13
|
s.description = %q{Used to find nearby records via latitude/longitude}
|
14
14
|
s.email = %q{fernyb@fernyb.net}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -36,13 +36,12 @@ Gem::Specification.new do |s|
|
|
36
36
|
"spec/support/test.db"
|
37
37
|
]
|
38
38
|
s.homepage = %q{http://github.com/fernyb/has_distance}
|
39
|
-
s.licenses = [
|
40
|
-
s.require_paths = [
|
41
|
-
s.rubygems_version = %q{1.
|
39
|
+
s.licenses = [%q{MIT}]
|
40
|
+
s.require_paths = [%q{lib}]
|
41
|
+
s.rubygems_version = %q{1.8.7}
|
42
42
|
s.summary = %q{Adds has_distance to ActiveRecord}
|
43
43
|
|
44
44
|
if s.respond_to? :specification_version then
|
45
|
-
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
46
45
|
s.specification_version = 3
|
47
46
|
|
48
47
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
@@ -28,6 +28,14 @@ module HasDistance
|
|
28
28
|
block.call(self.distance_config)
|
29
29
|
end
|
30
30
|
end
|
31
|
+
|
32
|
+
def nearby(opts={})
|
33
|
+
_config = self.distance_config
|
34
|
+
_this = new
|
35
|
+
_this.send("#{_config.lat_name}=".to_sym, opts.delete(:lat))
|
36
|
+
_this.send("#{_config.lng_name}=".to_sym, opts.delete(:lng))
|
37
|
+
_this.nearby(opts)
|
38
|
+
end
|
31
39
|
end # ClassMethods
|
32
40
|
|
33
41
|
module InstanceMethods
|
data/spec/has_distance_spec.rb
CHANGED
@@ -180,4 +180,16 @@ describe "Store" do
|
|
180
180
|
end
|
181
181
|
end
|
182
182
|
|
183
|
+
describe :nearby do
|
184
|
+
it "returns nearby results" do
|
185
|
+
store = Store.first
|
186
|
+
results = Store.nearby( :lat => store.latitude,
|
187
|
+
:lng => store.longitude)
|
188
|
+
results.to_sql.should == 'SELECT *,
|
189
|
+
(ACOS(least(1,COS(0.5953003919287299)*COS(-2.0620890579387803)*COS(RADIANS(latitude))*COS(RADIANS(longitude))+
|
190
|
+
COS(0.5953003919287299)*SIN(-2.0620890579387803)*COS(RADIANS(latitude))*SIN(RADIANS(longitude))+
|
191
|
+
SIN(0.5953003919287299)*SIN(RADIANS(latitude))))*3963.19)
|
192
|
+
AS distance FROM "stores" GROUP BY id HAVING distance <= 20 LIMIT 12'
|
193
|
+
end
|
194
|
+
end
|
183
195
|
end
|
data/spec/support/test.db
CHANGED
Binary file
|
metadata
CHANGED
@@ -1,131 +1,101 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: has_distance
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
|
6
|
-
- 1
|
7
|
-
- 0
|
8
|
-
- 0
|
9
|
-
version: 1.0.0
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.1.0
|
5
|
+
prerelease:
|
10
6
|
platform: ruby
|
11
|
-
authors:
|
7
|
+
authors:
|
12
8
|
- Fernando Barajas
|
13
9
|
autorequire:
|
14
10
|
bindir: bin
|
15
11
|
cert_chain: []
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
dependencies:
|
20
|
-
- !ruby/object:Gem::Dependency
|
12
|
+
date: 2011-09-24 00:00:00.000000000Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
21
15
|
name: rails
|
22
|
-
|
23
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
16
|
+
requirement: &2152611300 !ruby/object:Gem::Requirement
|
24
17
|
none: false
|
25
|
-
requirements:
|
26
|
-
- -
|
27
|
-
- !ruby/object:Gem::Version
|
28
|
-
segments:
|
29
|
-
- 3
|
30
|
-
- 0
|
31
|
-
- 0
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
32
21
|
version: 3.0.0
|
33
22
|
type: :runtime
|
34
|
-
version_requirements: *id001
|
35
|
-
- !ruby/object:Gem::Dependency
|
36
|
-
name: rspec
|
37
23
|
prerelease: false
|
38
|
-
|
24
|
+
version_requirements: *2152611300
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: rspec
|
27
|
+
requirement: &2152609280 !ruby/object:Gem::Requirement
|
39
28
|
none: false
|
40
|
-
requirements:
|
29
|
+
requirements:
|
41
30
|
- - ~>
|
42
|
-
- !ruby/object:Gem::Version
|
43
|
-
segments:
|
44
|
-
- 2
|
45
|
-
- 3
|
46
|
-
- 0
|
31
|
+
- !ruby/object:Gem::Version
|
47
32
|
version: 2.3.0
|
48
33
|
type: :development
|
49
|
-
version_requirements: *id002
|
50
|
-
- !ruby/object:Gem::Dependency
|
51
|
-
name: bundler
|
52
34
|
prerelease: false
|
53
|
-
|
35
|
+
version_requirements: *2152609280
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: bundler
|
38
|
+
requirement: &2152607800 !ruby/object:Gem::Requirement
|
54
39
|
none: false
|
55
|
-
requirements:
|
40
|
+
requirements:
|
56
41
|
- - ~>
|
57
|
-
- !ruby/object:Gem::Version
|
58
|
-
segments:
|
59
|
-
- 1
|
60
|
-
- 0
|
61
|
-
- 0
|
42
|
+
- !ruby/object:Gem::Version
|
62
43
|
version: 1.0.0
|
63
44
|
type: :development
|
64
|
-
version_requirements: *id003
|
65
|
-
- !ruby/object:Gem::Dependency
|
66
|
-
name: jeweler
|
67
45
|
prerelease: false
|
68
|
-
|
46
|
+
version_requirements: *2152607800
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: jeweler
|
49
|
+
requirement: &2152606960 !ruby/object:Gem::Requirement
|
69
50
|
none: false
|
70
|
-
requirements:
|
51
|
+
requirements:
|
71
52
|
- - ~>
|
72
|
-
- !ruby/object:Gem::Version
|
73
|
-
segments:
|
74
|
-
- 1
|
75
|
-
- 6
|
76
|
-
- 4
|
53
|
+
- !ruby/object:Gem::Version
|
77
54
|
version: 1.6.4
|
78
55
|
type: :development
|
79
|
-
version_requirements: *id004
|
80
|
-
- !ruby/object:Gem::Dependency
|
81
|
-
name: rcov
|
82
56
|
prerelease: false
|
83
|
-
|
57
|
+
version_requirements: *2152606960
|
58
|
+
- !ruby/object:Gem::Dependency
|
59
|
+
name: rcov
|
60
|
+
requirement: &2152605760 !ruby/object:Gem::Requirement
|
84
61
|
none: false
|
85
|
-
requirements:
|
86
|
-
- -
|
87
|
-
- !ruby/object:Gem::Version
|
88
|
-
|
89
|
-
- 0
|
90
|
-
version: "0"
|
62
|
+
requirements:
|
63
|
+
- - ! '>='
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: '0'
|
91
66
|
type: :development
|
92
|
-
version_requirements: *id005
|
93
|
-
- !ruby/object:Gem::Dependency
|
94
|
-
name: sqlite3
|
95
67
|
prerelease: false
|
96
|
-
|
68
|
+
version_requirements: *2152605760
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: sqlite3
|
71
|
+
requirement: &2152603780 !ruby/object:Gem::Requirement
|
97
72
|
none: false
|
98
|
-
requirements:
|
99
|
-
- -
|
100
|
-
- !ruby/object:Gem::Version
|
101
|
-
|
102
|
-
- 0
|
103
|
-
version: "0"
|
73
|
+
requirements:
|
74
|
+
- - ! '>='
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: '0'
|
104
77
|
type: :development
|
105
|
-
version_requirements: *id006
|
106
|
-
- !ruby/object:Gem::Dependency
|
107
|
-
name: csv-mapper
|
108
78
|
prerelease: false
|
109
|
-
|
79
|
+
version_requirements: *2152603780
|
80
|
+
- !ruby/object:Gem::Dependency
|
81
|
+
name: csv-mapper
|
82
|
+
requirement: &2152602640 !ruby/object:Gem::Requirement
|
110
83
|
none: false
|
111
|
-
requirements:
|
112
|
-
- -
|
113
|
-
- !ruby/object:Gem::Version
|
114
|
-
|
115
|
-
- 0
|
116
|
-
version: "0"
|
84
|
+
requirements:
|
85
|
+
- - ! '>='
|
86
|
+
- !ruby/object:Gem::Version
|
87
|
+
version: '0'
|
117
88
|
type: :development
|
118
|
-
|
89
|
+
prerelease: false
|
90
|
+
version_requirements: *2152602640
|
119
91
|
description: Used to find nearby records via latitude/longitude
|
120
92
|
email: fernyb@fernyb.net
|
121
93
|
executables: []
|
122
|
-
|
123
94
|
extensions: []
|
124
|
-
|
125
|
-
extra_rdoc_files:
|
95
|
+
extra_rdoc_files:
|
126
96
|
- LICENSE.txt
|
127
97
|
- README.rdoc
|
128
|
-
files:
|
98
|
+
files:
|
129
99
|
- .document
|
130
100
|
- .rspec
|
131
101
|
- Gemfile
|
@@ -143,37 +113,29 @@ files:
|
|
143
113
|
- spec/support/store.rb
|
144
114
|
- spec/support/stores.csv
|
145
115
|
- spec/support/test.db
|
146
|
-
has_rdoc: true
|
147
116
|
homepage: http://github.com/fernyb/has_distance
|
148
|
-
licenses:
|
117
|
+
licenses:
|
149
118
|
- MIT
|
150
119
|
post_install_message:
|
151
120
|
rdoc_options: []
|
152
|
-
|
153
|
-
require_paths:
|
121
|
+
require_paths:
|
154
122
|
- lib
|
155
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
123
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
156
124
|
none: false
|
157
|
-
requirements:
|
158
|
-
- -
|
159
|
-
- !ruby/object:Gem::Version
|
160
|
-
|
161
|
-
|
162
|
-
version: "0"
|
163
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
125
|
+
requirements:
|
126
|
+
- - ! '>='
|
127
|
+
- !ruby/object:Gem::Version
|
128
|
+
version: '0'
|
129
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
164
130
|
none: false
|
165
|
-
requirements:
|
166
|
-
- -
|
167
|
-
- !ruby/object:Gem::Version
|
168
|
-
|
169
|
-
- 0
|
170
|
-
version: "0"
|
131
|
+
requirements:
|
132
|
+
- - ! '>='
|
133
|
+
- !ruby/object:Gem::Version
|
134
|
+
version: '0'
|
171
135
|
requirements: []
|
172
|
-
|
173
136
|
rubyforge_project:
|
174
|
-
rubygems_version: 1.
|
137
|
+
rubygems_version: 1.8.7
|
175
138
|
signing_key:
|
176
139
|
specification_version: 3
|
177
140
|
summary: Adds has_distance to ActiveRecord
|
178
141
|
test_files: []
|
179
|
-
|