module LookupBy::Lookup::MacroMethods

Public Instance Methods

is_a_lookup?() click to toggle source
# File lib/lookup_by/lookup.rb, line 7
def is_a_lookup?
  is_a? Lookup::ClassMethods
end
lookup_by(field, options = {}) click to toggle source
# File lib/lookup_by/lookup.rb, line 23
def lookup_by(field, options = {})
  begin
    return unless table_exists?
  rescue => error
    Rails.logger.error "lookup_by caught #{error.class.name} when connecting - skipping initialization (#{error.inspect})"
    return
  end

  options.symbolize_keys!
  options.assert_valid_keys :allow_blank, :order, :cache, :normalize, :find, :find_or_create, :raise, :safe

  raise "#{self} already called lookup_by" if is_a? Lookup::ClassMethods
  raise "#{self} responds_to .[], needed for lookup_by"     if respond_to? :[]
  raise "#{self} responds_to .lookup, needed for lookup_by" if respond_to? :lookup

  extend ClassMethods

  class_eval do
    include InstanceMethods

    singleton_class.class_eval do
      attr_reader :lookup
    end

    lookup_by_disable :destroy, :destroy_all, :delete, :delete_all

    # TODO: check for a db unique constraint or Rails validation

    unless field == :name || column_names.include?("name")
      alias_attribute :name, field

      attr_accessible :name if respond_to?(:accessible_attributes) && accessible_attributes.include?(field)
    end

    @lookup = Cache.new(self, options.merge(field: field))
    @lookup.load
  end

  LookupBy.register self
end
lookup_by_disable(*methods) click to toggle source
# File lib/lookup_by/lookup.rb, line 11
      def lookup_by_disable(*methods)
        methods.each do |method|
          instance_eval <<-"END", __FILE__, __LINE__ + 1
            def self.#{method}(*args)
              raise NotImplementedError, "#{name}.#{method} is not supported on cached lookup tables." if @lookup.has_cache?

              super
            end
          END
        end
      end