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