module ProgneTapera::EnumList
Public Instance Methods
add_item(item)
click to toggle source
# File lib/progne_tapera/enum_list.rb, line 39 def add_item(item) raise ArgumentError.new "The #{item.inspect} item should be an instance of ProgneTapera::EnumItem." unless item.is_a? ProgneTapera::EnumItem raise ArgumentError.new "The #{item.constant_name} enum item was defined already." if item_defined? item const_set item.constant_name, item after_add_item item end
after_add_item(item)
click to toggle source
# File lib/progne_tapera/enum_list.rb, line 57 def after_add_item(item) item_method_module = "#{self.name}::ItemMethods".safe_constantize item.instance_eval do item.extend item_method_module end if item_method_module.present? end
all()
click to toggle source
列出所有的枚举型。如: Gender.all
# File lib/progne_tapera/enum_list.rb, line 80 def all enum_constants.map { |constant| const_get constant } end
deserialize(value)
click to toggle source
ActiveRecord::Type::Value
# File lib/progne_tapera/enum_list.rb, line 105 def deserialize(value) select { |item| item.code==value } end
each(&block)
click to toggle source
Enumerable
# File lib/progne_tapera/enum_list.rb, line 89 def each(&block) all.each &block end
enum_constants()
click to toggle source
Infrastructure for the Enumerable
# File lib/progne_tapera/enum_list.rb, line 70 def enum_constants constants.select { |constant| value = const_get constant value.is_a? ProgneTapera::EnumItem } end
enum_name(name = nil)
click to toggle source
向枚举类型提供枚举的配置名。如果不提供配置名则根据枚举类型的名称自动猜测。如: eumu_name # 或 enum_name
:gender
# File lib/progne_tapera/enum_list.rb, line 25 def enum_name(name = nil) return @enum_name if @enum_name.present? @enum_name = (name||self.name.demodulize.underscore).to_sym end
form_options(&block)
click to toggle source
Form Option
# File lib/progne_tapera/enum_list.rb, line 99 def form_options(&block) items = block_given? ? selected(&block) : selected items.map { |item| [ item.localized_name, item.code ] }.to_h end
item_defined?(item)
click to toggle source
判断指定的枚举项是否已经定义。如: item_defined? male
# File lib/progne_tapera/enum_list.rb, line 35 def item_defined?(item) const_defined? item.constant_name end
lookup(code)
click to toggle source
Lookup
# File lib/progne_tapera/enum_list.rb, line 94 def lookup(code) select { |item| item.code==code }.first end
safe_add_item(item)
click to toggle source
以安全的方式向一个枚举列表中添加一个枚举项。如果该枚举项已经在枚举列表中,则不添加。如: Gender.safe_add_item male Gender.safe_add_item female Gender.safe_add_item male # male won't be added twice.
# File lib/progne_tapera/enum_list.rb, line 52 def safe_add_item(item) const_set item.constant_name, item if item.is_a?(ProgneTapera::EnumItem)&&!item_defined?(item) after_add_item item end
selected() { |all| ... }
click to toggle source
# File lib/progne_tapera/enum_list.rb, line 84 def selected block_given? ? yield(all) : all end
serialize(value)
click to toggle source
# File lib/progne_tapera/enum_list.rb, line 109 def serialize(value) value.respond_to?(:code) ? value.code : value end