module Enumize::Model

Public Instance Methods

enum(opts) click to toggle source
Calls superclass method
# File lib/enumize/model.rb, line 8
def enum(opts)
  super(opts)

  klass = self
  singular_model_name = klass.name.singularize.underscore
  locale_prefix = "activerecord.enums.#{singular_model_name}"

  opts.each do |name, values|
    # def status_name; I18n.t("activerecord.enums.book.status.#{status}"); end
    detect_enum_conflict!(name, "#{name}_name")
    define_method("#{name}_name") do
      return "" if self.send(name).nil?
      I18n.t("#{locale_prefix}.#{name}.#{self.send(name)}")
    rescue I18n::MissingTranslationData
      self[field].titleize
    end

    # def status_color; I18n.t("activerecord.enums.book.status_color.#{status}"); end
    detect_enum_conflict!(name, "#{name}_color")
    define_method("#{name}_color") do
      return "black" if self.send(name).nil?
      I18n.t("#{locale_prefix}.#{name}_color.#{self.send(name)}", raise: true)
    rescue I18n::MissingTranslationData
      return "black"
    end

    # def status_value; Book.statuses[self.status]; end
    detect_enum_conflict!(name, "#{name}_value")
    define_method("#{name}_value") do
      return nil if self.send(name).nil?
      klass.send(name.to_s.pluralize)[self[name]]
    end

    # Book.state_options # => [["Draft", "draft"], ["Published", "published"], ["Archived", "archived"]]
    detect_enum_conflict!(name, "#{name}_options", true)
    define_singleton_method("#{name}_options") do
      self.send(name.to_s.pluralize).map do |k, _|
        label = self.new(name => k).send("#{name}_name")
        [label, k]
      end
    end
  end
end