Sha256: 347c1d95ee6f86becd65195a63b106e4b86c6ea9a925f3d44a462a59e323dbb0

Contents?: true

Size: 1.92 KB

Versions: 2

Compression:

Stored size: 1.92 KB

Contents

module BelongsToCity
  
  def self.included(base)
    base.extend ClassMethods
  end
  
  module ClassMethods
    
    def belongs_to_city(args = {})
      city_attribute = args[:as].nil? ? :city : args[:as]
      city_attribute_helper = (city_attribute.to_s + '_name').to_sym
      city_collector = city_attribute.to_s.pluralize.to_sym
      
      attr_accessor city_collector
      belongs_to    city_attribute, :class_name => "City"
      
      #Getter and Setter Methods
      define_method "#{city_attribute}_name" do
        return read_attribute("#{city_attribute}_name") if read_attribute("#{city_attribute}_name")
        return "#{send(city_attribute).name}, #{send(city_attribute).state.short2}" if read_attribute(city_attribute)
      end

      define_method "#{city_attribute}_name=" do |city_name|
        write_attribute("#{city_attribute}_name", city_name)
        write_attribute(city_collector, City.find_by_full_name(city_name) || [])
        if read_attribute(city_collector).size == 1
          send "#{city_attribute}=", read_attribute(city_collector).first
        else
          send "#{city_attribute}=", nil
        end
      end
      
      #Validation Methods
      if args[:required]
        if args[:messages]
          too_many_cities_message = args[:messages][:on_many_matches]
          no_cities_message = args[:messages][:on_no_matches]
        end
        too_many_cities_message ||="Too many cities found in your request, please be more specific"
        no_cities_message ||= "We couldn't find any city in your request"
        validate do |record|
          cities = record.read_attribute(city_collector)
          record.errors.add(city_attribute_helper, too_many_cities_message) if cities.size > 1 rescue nil
          record.errors.add(city_attribute_helper, no_cities_message) if (cities.nil? or cities.size == 0)
        end
      end
      
    end
    
  end
  
end

class ActiveRecord::Base
  include BelongsToCity
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
belongs_to_city-0.7.0 lib/belongs_to_city.rb
belongs_to_city-0.6.0 lib/belongs_to_city.rb