Module: ConstEnum::ActiveRecord::ClassMethods
- Defined in:
- lib/const_enum/active_record.rb
Instance Method Summary collapse
-
#const(clazz_name, options = {}, &block) ⇒ Object
定数クラス、定数ラベルアクセサ、named_scope、predicate methodを作成します.
Instance Method Details
#const(clazz_name, options = {}, &block) ⇒ Object
定数クラス、定数ラベルアクセサ、named_scope、predicate methodを作成します
arguments
mod_name: 定義されるクラスの名前です options:
:scope named_scopeを定義します。default: true
:predicate 属性値の検証メソッドを定義します。default: true
:prefix scope, predicate を作成する際のprefixを指定します。default: "#{mod_name.downcase}_"
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
51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 |
# File 'lib/const_enum/active_record.rb', line 51 def const(clazz_name, = {}, &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} = default.merge(.symbolize_keys) attr = [:attr] if ConstEnum::ActiveRecord.i18n and [:i18n] clazz = const_enum do include ConstEnum::WithI18n class_eval(&block) end clazz.[:key] = [clazz.[:key], self.name.underscore, attr].join('.') clazz..merge!(ConstEnum::ActiveRecord.i18n) if Hash === ConstEnum::ActiveRecord.i18n clazz..merge!([:i18n]) if Hash === [:i18n] else clazz = const_enum(&block) end const_set(clazz_name, clazz) if [:label_suffix] class_eval <<-"EOS", __FILE__, __LINE__ def #{attr}#{[:label_suffix]} #{clazz_name}[#{attr}].try(:label) end def #{attr}#{[:label_suffix]}_was #{clazz_name}[#{attr}_was].try(:label) end EOS end if [:scope] clazz.each do |obj| key = clazz.key(obj.value).to_s class_eval <<-"EOS", __FILE__, __LINE__ scope :#{[:prefix]}#{key.downcase}, lambda { {:conditions => {'#{attr}' => #{clazz_name}::#{key} } }} EOS end end if [:predicate] clazz.each do |obj| key = clazz.key(obj.value).to_s class_eval <<-"EOS", __FILE__, __LINE__ def #{[:prefix]}#{key.downcase}? #{attr} == #{clazz_name}::#{key} end def was_#{[:prefix]}#{key.downcase}? #{attr}_was == #{clazz_name}::#{key} end EOS end end if [:validation] validates attr.to_sym, :inclusion => {:in => clazz}, :allow_blank => (!![:allow_blank]) end clazz end |