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 CHANGED
@@ -1,11 +1,73 @@
1
1
  = has_distance
2
2
 
3
- A Ruby gem to add has_distance to your ActiveRecord Model.
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
- == Usage
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.0.0
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.0.0"
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 = ["Fernando Barajas"]
12
- s.date = %q{2011-08-09}
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 = ["MIT"]
40
- s.require_paths = ["lib"]
41
- s.rubygems_version = %q{1.3.7}
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
@@ -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
- prerelease: false
5
- segments:
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
- date: 2011-08-09 00:00:00 -07:00
18
- default_executable:
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
- prerelease: false
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
- requirement: &id002 !ruby/object:Gem::Requirement
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
- requirement: &id003 !ruby/object:Gem::Requirement
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
- requirement: &id004 !ruby/object:Gem::Requirement
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
- requirement: &id005 !ruby/object:Gem::Requirement
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
- segments:
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
- requirement: &id006 !ruby/object:Gem::Requirement
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
- segments:
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
- requirement: &id007 !ruby/object:Gem::Requirement
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
- segments:
115
- - 0
116
- version: "0"
84
+ requirements:
85
+ - - ! '>='
86
+ - !ruby/object:Gem::Version
87
+ version: '0'
117
88
  type: :development
118
- version_requirements: *id007
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
- segments:
161
- - 0
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
- segments:
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.3.7
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
-