Module: ArLookups::BaseExt

Defined in:
lib/ar_lookups/base_ext.rb

Instance Method Summary collapse

Instance Method Details

#ar_lookupsObject



3
4
5
# File 'lib/ar_lookups/base_ext.rb', line 3

def ar_lookups
  @ar_lookups ||= superclass.respond_to?(:ar_lookups) ? superclass.ar_lookups.dup : {}
end

#lookup(column, *args) ⇒ Object



7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/ar_lookups/base_ext.rb', line 7

def lookup(column, *args)
  options = args.extract_options!
  lookup_model = args.first

  options.reverse_merge!(key_column: :key, name_column: :name)

  # Directly override accessors and super to the module below
  class_eval <<-RUBY, __FILE__, __LINE__ + 1
    def #{column}; super; end
    def #{column}=(value); super; end
  RUBY

  ar_lookups[column] = lookup_model || implicit_lookup_class(column)

  # Mixin this Module so that we can use super in these functions
  mod = Module.new
  include mod
  mod.class_eval <<-RUBY, __FILE__, __LINE__ + 1
    def #{column}
      keys = read_attribute(:#{column})
      return {} if keys.blank?
      Hash[self.class.ar_lookups[:#{column}].where('#{options[:key_column]} IN (?)', keys).pluck(:#{options[:key_column]}, :#{options[:name_column]})]
    end

    def #{column}_ids
      read_attribute(:#{column})
    end

    def #{column}=(val)
      write_attribute(:#{column}, val)
    end
  RUBY
end