Sha256: cce0919733b644fcd79f9acc3010610f4d07e35eb48fd8afcbb2b7c04dda36aa
Contents?: true
Size: 1.74 KB
Versions: 4
Compression:
Stored size: 1.74 KB
Contents
module ActiveEnum class DuplicateValue < StandardError; end class Base class << self def inherited(subclass) ActiveEnum.enum_classes << subclass end # :id => 1, :title => 'Foo' # :title => 'Foo' # def value(enum_value={}) @values ||= [] id = enum_value[:id] || next_id check_duplicate(id, enum_value[:name]) @values << [id, enum_value[:name]] sort_values! end # order enum values using :asc or :desc # def order(order) @order = order end def all @values || [] end def ids @values.map {|v| v[0] } end def names @values.map {|v| v[1] } end def to_select @values.map {|v| [v[1], v[0]] } end def [](index) if index.is_a?(Fixnum) row = lookup_by_id(index) row[1] if row else row = lookup_by_name(index) row[0] if row end end private def lookup_by_id(index) @values.assoc(index) end def lookup_by_name(index) @values.rassoc(index.to_s) || @values.rassoc(index.to_s.titleize) end def next_id (ids.max || 0) + 1 end def check_duplicate(id, name) if lookup_by_id(id) raise ActiveEnum::DuplicateValue, "The id #{id} is already defined for #{self} enum." elsif lookup_by_name(name) raise ActiveEnum::DuplicateValue, "The name #{name} is already defined for #{self} enum." end end def sort_values! case (@order || :asc) when :asc @values.sort! {|a,b| a[0] <=> b[0] } when :desc @values.sort! {|a,b| b[0] <=> a[0] } end end end end end
Version data entries
4 entries across 4 versions & 1 rubygems
Version | Path |
---|---|
active_enum-0.6.1 | lib/active_enum/base.rb |
active_enum-0.6.0 | lib/active_enum/base.rb |
active_enum-0.5.1 | lib/active_enum/base.rb |
active_enum-0.5.0 | lib/active_enum/base.rb |