module ConstEnum::ActiveRecord::ClassMethods
Public Instance Methods
const(clazz_name, options = {}, &block)
click to toggle source
定数クラス、定数ラベルアクセサ、named_scope、predicate methodを作成します
arguments¶ ↑
mod_name: 定義されるクラスの名前です options:
:scope named_scopeを定義します。default: true :predicate 属性値の検証メソッドを定義します。default: true :prefix scope, predicate を作成する際のprefixを指定します。default: "#{mod_name.downcase}_" :i18n ラベル名にi18nを利用しない
extensions: ブロック内でメソッド定義を行うことで、定数オブジェクトに対してメソッドを定義することが出来ます。
exapmle¶ ↑
class Hoge < ActiveRecord::Base const :STATUS do ENABLE 1, '有効' DISABLE 0, '無効' def code '%05d'%value end end end
Hoge::STATUS::ENABLE # 1 Hoge::STATUS.ENABLE.value # 1 Hoge::STATUS.ENABLE.label # “有効” Hoge::STATUS.ENABLE.code # 00001 Hoge.crate(:name => '有効なHOGE', :status => Hoge::STATUS::ENABLE) Hoge.crate(:name => '無効なHOGE', :status => Hoge::STATUS::DISABLE) enable_hoge = Hoge.status_enable.first enable_hoge.name # “有効なHOGE” enable_hoge.status_label # “有効” newhoge = Hoge.new(:name => '新しいHOGE', :status => Hoge::STATUS::ENABLE) newhoge.status_enable? # true newhoge.status_disable? # false form_for newhoge do |f|
f.collection_select(:status, Hoge::STATUS, :value, :label) f.collection_select(:status, Hoge::STATUS, :value, :code)
end
# File lib/const_enum/active_record.rb, line 52 def const(clazz_name, options = {}, &block) clazz_name = clazz_name.to_s default = {:label_suffix => ConstEnum::ActiveRecord.label_suffix,:scope => true, :predicate => true, :attr=>clazz_name.downcase, :prefix => "#{clazz_name.downcase}_", :validation => false, :allow_blank => true, :i18n => true} options = default.merge(options.symbolize_keys) attr = options[:attr] if ConstEnum::ActiveRecord.i18n and options[:i18n] clazz = const_enum do include ConstEnum::WithI18n class_eval(&block) end clazz.i18n_options.merge!(ConstEnum::ActiveRecord.i18n) if Hash === ConstEnum::ActiveRecord.i18n clazz.i18n_options[:key] = [clazz.i18n_options[:key], self.name.underscore, attr].join('.') clazz.i18n_options.merge!(options[:i18n]) if Hash === options[:i18n] else clazz = const_enum(&block) end const_set(clazz_name, clazz) if options[:label_suffix] class_eval <<-"EOS", __FILE__, __LINE__ def #{attr}#{options[:label_suffix]} #{clazz_name}[#{attr}].try(:label) end def #{attr}#{options[:label_suffix]}_was #{clazz_name}[#{attr}_was].try(:label) end EOS end if options[:scope] clazz.each do |obj| key = clazz.key(obj.value).to_s class_eval <<-"EOS", __FILE__, __LINE__ scope :#{options[:prefix]}#{key.downcase}, lambda { where('#{attr}' => #{clazz_name}::#{key}) } EOS end end if options[:predicate] clazz.each do |obj| key = clazz.key(obj.value).to_s class_eval <<-"EOS", __FILE__, __LINE__ def #{options[:prefix]}#{key.downcase}? #{attr} == #{clazz_name}::#{key} end def was_#{options[:prefix]}#{key.downcase}? #{attr}_was == #{clazz_name}::#{key} end EOS end end if options[:validation] validates attr.to_sym, :inclusion => {:in => clazz}, :allow_blank => (!!options[:allow_blank]) end clazz end