Skip to content

Instantly share code, notes, and snippets.

@mboyle
Created April 29, 2015 06:02
Show Gist options
  • Save mboyle/58dd3add830bbdeef316 to your computer and use it in GitHub Desktop.
Save mboyle/58dd3add830bbdeef316 to your computer and use it in GitHub Desktop.
require 'active_support/concern'
module Geocoordinateable
extend ActiveSupport::Concern
included do
define_method :latitude do
@latitude ||= self.class.select_one_sanitize([%{
SELECT postgis.ST_Y(geocoordinates) AS latitude
FROM #{self.class.table_name}
WHERE id = ?
}, id])['latitude'].try(:to_f)
end
define_method :longitude do
@longitude ||= self.class.select_one_sanitize([%{
SELECT postgis.ST_X(geocoordinates) AS longitude
FROM #{self.class.table_name}
WHERE id = ?
}, id])['longitude'].try(:to_f)
end
define_method :geocoordinates do
unless @geocoordinates
@geocoordinates = if @latitude && @longitude
[@latitude, @longitude]
else
row = self.class.select_one_sanitize([%{
SELECT postgis.ST_Y(geocoordinates) AS latitude, postgis.ST_X(geocoordinates) AS longitude
FROM #{self.class.table_name}
WHERE id = ?
}, id])
logger.debug "GEOCOORDINATES: #{row.inspect}"
[row.try(:[], 'latitude').try(:to_f), row.try(:[], 'longitude').try(:to_f)]
# [nil, nil]
end
if @geocoordinates[0].nil? && @geocoordinates[1].nil?
@geocoordinates = nil
else
@latitude, @longitude = @geocoordinates
end
end
@geocoordinates
end
define_method :latitude= do |latitude|
raise 'latitude must be >= -180' unless latitude >= -180
raise 'latitude must be <= 180' unless latitude <= 180
self.class.update_sanitize([%{
UPDATE #{self.class.table_name} SET geocoordinates = 'SRID=4326;POINT(' ||
CASE WHEN geocoordinates IS NOT NULL THEN postgis.ST_Y(geocoordinates) ELSE 0 END ||
' ' ||
? ||
')'
WHERE id = ?
}, latitude, id])
Activity.update_geocoordinates_for_user!(self)
@geocoordinates = nil
@latitude = latitude
end
define_method :longitude= do |longitude|
raise 'longitude must be >= -180' unless longitude >= -180
raise 'longitude must be <= 180' unless longitude <= 180
self.class.update_sanitize([%{
UPDATE #{self.class.table_name} SET geocoordinates = 'SRID=4326;POINT(' ||
? ||
' ' ||
CASE WHEN geocoordinates IS NOT NULL THEN postgis.ST_X(geocoordinates) ELSE 0 END ||
')'
WHERE id = ?
}, longitude, id])
Activity.update_geocoordinates_for_user!(self)
@geocoordinates = nil
@longitude = longitude
end
define_method :geocoordinates= do |coordinates|
latitude, longitude = coordinates
raise 'latitude must be >= -180' unless latitude >= -180
raise 'latitude must be <= 180' unless latitude <= 180
raise 'longitude must be >= -180' unless longitude >= -180
raise 'longitude must be <= 180' unless longitude <= 180
# 'SRID=4326;POINT(' || ? || ' ' || ? || ')'
self.class.update_sanitize([%{
UPDATE #{self.class.table_name}
SET geocoordinates = ST_GeomFromText('POINT(? ?)', 4326)
WHERE id = ?
}, latitude, longitude, id])
if self.is_a?(User)
Activity.update_geocoordinates_for_user!(self)
end
@latitude = latitude
@longitude = longitude
@geocoordinates = [latitude, longitude]
end
end
module ClassMethods
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment