module RailsColumnEnumerator
Constants
- VERSION
Public Class Methods
get_int(val, enum_values, valid_values = nil)
click to toggle source
# File lib/rails_column_enumerator.rb, line 4 def self.get_int(val, enum_values, valid_values = nil) if val.is_a?(String) || val.is_a?(Symbol) val = enum_values[val.to_s.downcase] || val.try(:to_i) end raise "Values in options must be valid for enumerated column." if valid_values && valid_values[val].blank? val end
get_record(val, enum_values, valid_values, helper_name, column_name, class_name)
click to toggle source
# File lib/rails_column_enumerator.rb, line 12 def self.get_record(val, enum_values, valid_values, helper_name, column_name, class_name) val = get_int(val, enum_values, valid_values) key = valid_values[val] text = I18n.t(".models.#{class_name}.#{column_name}.#{helper_name}.#{key}", default: I18n.t(".models.#{class_name}.#{column_name}.default.#{key}", default: valid_values[val].to_s.titleize)) [text, val] end
Public Instance Methods
enumerated_column(column_name, enumerated_values, options = {})
click to toggle source
# File lib/rails_column_enumerator.rb, line 19 def enumerated_column(column_name, enumerated_values, options = {}) enum_name = column_name.to_s.pluralize.upcase.to_sym enum_symbols_name = (column_name.to_s.upcase + '_NAMES').to_sym self.const_set(enum_name, enumerated_values.with_indifferent_access) self.const_set(enum_symbols_name, enumerated_values.invert) extra_select_options = options.delete(:selections) if extra_select_options extra_select_options.each do |name, options| self.class.send(:define_method, name.to_s) { options.map{ |key| RailsColumnEnumerator.get_record(key, self.const_get(enum_name), self.const_get(enum_symbols_name), name, column_name, self.name.underscore.downcase) } } end end self.send(:define_method, column_name) do |return_symbol = false| return_symbol ? self.class.const_get(enum_symbols_name)[read_attribute(column_name)].to_sym : read_attribute(column_name) end self.send(:define_method, column_name.to_s + '=') do |val| write_attribute(column_name, RailsColumnEnumerator.get_int(val, self.class.const_get(enum_name))) end enumerated_values.keys.each do |key| self.send(:define_method, key.to_s + '?') do key.to_sym == self.send(column_name, true) end end enumerator_associations = options.delete(:scopes) if enumerator_associations enumerator_associations.each do |key,values| found_values = values.map { |val| RailsColumnEnumerator.get_int(val, self.const_get(enum_name), self.const_get(enum_symbols_name)) } raise "You must provide some values for the scope." if found_values.blank? self.define_singleton_method(key) do self.where(column_name => found_values) end self.send(:define_method, key.to_s + "_include?") do |val| found_values.include?(RailsColumnEnumerator.get_int(val, self.class.const_get(enum_name))) end end end options.merge!(inclusion: const_get(enum_name).values) unless options[:inclusion].present? validates column_name, options end