33 lines
975 B
Ruby
33 lines
975 B
Ruby
require 'geokit'
|
|
|
|
class Thing < ActiveRecord::Base
|
|
extend Forwardable
|
|
include ActiveModel::ForbiddenAttributesProtection
|
|
belongs_to :user
|
|
def_delegators :reverse_geocode, :city, :country, :country_code,
|
|
:full_address, :state, :street_address, :street_name,
|
|
:street_number, :zip
|
|
has_many :reminders
|
|
validates :city_id, uniqueness: true, allow_nil: true
|
|
validates :lat, presence: true
|
|
validates :lng, presence: true
|
|
|
|
def self.find_closest(lat, lng, limit = 10)
|
|
query = <<-SQL
|
|
SELECT *, (3959 * ACOS(COS(RADIANS(?)) * COS(RADIANS(lat)) * COS(RADIANS(lng) - RADIANS(?)) + SIN(RADIANS(?)) * SIN(RADIANS(lat)))) AS distance
|
|
FROM things
|
|
ORDER BY distance
|
|
LIMIT ?
|
|
SQL
|
|
find_by_sql([query, lat.to_f, lng.to_f, lat.to_f, limit.to_i])
|
|
end
|
|
|
|
def reverse_geocode
|
|
@reverse_geocode ||= Geokit::Geocoders::MultiGeocoder.reverse_geocode([lat, lng])
|
|
end
|
|
|
|
def adopted?
|
|
!user.nil?
|
|
end
|
|
end
|