module ArLookups::ActiveRecordExt
Public Instance Methods
ar_lookups()
click to toggle source
# File lib/ar_lookups/activerecord_ext.rb, line 3 def ar_lookups @ar_lookups ||= superclass.respond_to?(:ar_lookups) ? superclass.ar_lookups.dup : {} end
lookup(column, *args)
click to toggle source
# File lib/ar_lookups/activerecord_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}) klass = self.class.ar_lookups[:#{column}] return klass.none if keys.blank? 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
Private Instance Methods
implicit_lookup_class(column)
click to toggle source
# File lib/ar_lookups/activerecord_ext.rb, line 44 def implicit_lookup_class(column) column.to_s.camelize.singularize.constantize end