module Labelizer::ClassMethods
Public Instance Methods
labelized()
click to toggle source
# File lib/labelizer.rb, line 19 def labelized @labelized ||= Container.new([]){|attr_labelized,attr| model = self.to_s.underscore values = __send__(attr.to_s.pluralize) labelized = Container.new(values, accept_array_key: true){|value_labelized,value| data = labelized.instance_variable_get(:@data) attr_label_types = data[:label_types] attr_converter = data[:converter] unless labelized.has_key?(value) Container.new(attr_label_types){|h,label_type| h[label_type] = value.map{|val| value_labelized[val][label_type]} } else value_labelized[value] = Container.new(attr_label_types){|h,label_type| if label_type == :value result = value else result = ::I18n.translate( "labelizer.#{model}.#{attr}.#{value}.#{label_type}", default: [ :"labelizer.#{model}.#{attr}.#{label_type}", :"labelizer.#{model}.#{label_type}", :"labelizer.#{label_type}", "", ], ) if c = attr_converter[label_type] result = c[result] end end h[label_type] = result } end } labelized.singleton_class.class_eval do define_method :pluck do |*require_label_types| map{|value,label_type_labelized| require_label_types.map{|require_label_type| label_type_labelized[require_label_type] } } end end attr_labelized[attr] = labelized } end
Private Instance Methods
labelize(attr_name, label_types, converter: {})
click to toggle source
# File lib/labelizer.rb, line 71 def labelize(attr_name, label_types, converter: {}) label_types = label_types.map(&:to_sym) raise ArgumentError, "label types can't include :value" if label_types.include?(:value) label_types << :value define_method :"#{attr_name}_labelized" do labelized[attr_name] end label_types.each do |label_type| define_method :"#{attr_name}_#{label_type}" do labelized[attr_name][label_type] end end labelized.instance_variable_get(:@keys) << attr_name labelized.singleton_class.class_eval do define_method attr_name do self[attr_name] end end data = labelized[attr_name].instance_variable_get(:@data) data[:label_types] = label_types data[:converter] = converter labelized[attr_name] end