Pārlūkot izejas kodu

Only query for posts on the specified layer

master
Adrian Short pirms 11 gadiem
vecāks
revīzija
96475c860d
1 mainītis faili ar 27 papildinājumiem un 8 dzēšanām
  1. +27
    -8
      app/models/post.rb

+ 27
- 8
app/models/post.rb Parādīt failu

@@ -3,11 +3,12 @@ class Post < ActiveRecord::Base
EARTH_RADIUS_METRES = 6378000
def self.near(lat, lon, radius_metres)
def self.near(lat, lon, radius_metres, layer_id)
# Santize inputs. Is this necessary?
lat = lat.to_f
lon = lon.to_f
radius_metres = radius_metres.to_i
layer_id = layer_id.to_i

# Calculate distance using the Haversine formula
self.find_by_sql(<<-ENDQUERY
@@ -34,13 +35,31 @@ class Post < ActiveRecord::Base
ON p.feed_id = f.id
WHERE
( #{EARTH_RADIUS_METRES}
* acos( cos( radians('#{lat}') )
* cos( radians( p.lat ) )
* cos( radians( p.lon )
- radians('#{lon}') )
+ sin( radians('#{lat}') )
* sin( radians( p.lat ) ) ) )
p.id IN
( -- Subquery returns a list of post_ids for posts on this layer
SELECT p.id

FROM feeds_layers fl
INNER JOIN feeds f
ON fl.feed_id = f.id

INNER JOIN posts p
ON p.feed_id = f.id

WHERE fl.layer_id = #{layer_id}
)
AND
(
#{EARTH_RADIUS_METRES}
* acos( cos( radians('#{lat}') )
* cos( radians( p.lat ) )
* cos( radians( p.lon )
- radians('#{lon}') )
+ sin( radians('#{lat}') )
* sin( radians( p.lat ) ) )
)
<= #{radius_metres}
ORDER BY distance


Notiek ielāde…
Atcelt
Saglabāt