Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
getfitter-core / app / models / core / venue.rb
Size: Mime:
module Core
  class Venue < ActiveRecord::Base
    include PgSearch

    has_many :organisation_venues, dependent: :destroy
    has_many :organisations, through: :organisation_venues
    has_many :events, through: :organisation_venues
    has_many :instructors, through: :events # for :deep_search

    validates :name, presence: true
    validates :address, presence: true
    validates :phone, presence: true

    before_destroy :check_for_events

    default_scope { order('created_at') }
    scope :close_to, -> (latitude, longitude, distance_in_meters = 2000) {
      where(%{
        ST_DWithin(
          ST_GeographyFromText(
            'SRID=4326;POINT(' || core_venues.longitude
              || ' ' || core_venues.latitude || ')'
          ),
          ST_GeographyFromText('SRID=4326;POINT(%f %f)'),
          %d
        )
      } % [longitude, latitude, distance_in_meters])
    }

    pg_search_scope :search, against: [:name, :address],
                             using: { tsearch: { prefix: true } }

    pg_search_scope :deep_search, against: [:name, :address],
                                  associated_against: { events: :name,
                                                        instructors: :name },
                                  using: { tsearch: { prefix: true } }
    private

    def check_for_events
      unless events.empty?
        self.errors[:base] << 'Cannot delete Venues with Events'

        return false
      end
    end
  end
end