lib/enum_attr.rb in enum_attr-0.0.1 vs lib/enum_attr.rb in enum_attr-0.0.3
- old
+ new
@@ -1,21 +1,57 @@
module EnumAttr
module Mixin
# for model Contract:
- # enum_attr :contract_type, [['拍品合同', '0', "auction"], ['商品合同', '1', "goods"], ["台湾合同", '2', "taiwan"]]
+ # enum_attr :status, [['新建', 0, "origin"], ['整理中', 1, "collecting"], ["已上传", 2, "uploaded"]]
+ # It generates these code for you:
+ # # status const
+ # STATUS_ORIGIN = 0; STATUS_COLLECTING = 2; STATUS_UPLOADED = 3
#
+ # # scopes for column status
+ # scope :status_origin, where("status=0")
+ # scope :status_collection, where("status=1")
+ # scope :status_uploaded, where("status=2")
+ #
+ # # for view select
+ # ENUMS_STATUS = [["新建", 0], ["整理中", 1], ["已上传", 2]]
+
+ # # validates
+ # validates_inclusion_of "status", :in => [1, 2, 3], :allow_nil => true
+ #
+ # # column_name instant method
+ # def status_origin
+ # # return status name by it's status value
+ # end
+ #
def enum_attr(attr, enums)
+ raise "The secone param must be a array!" unless enums.is_a? Array
+
attr = attr.to_s
+
enums.each do |enum|
const_set("#{attr.upcase}_#{enum[2].upcase}", enum[1] )
- end
+
+ # TODO: how to judge if there is active_record 3 gem here?
+ scope "#{attr}_#{enum[2]}".to_sym, where("#{attr}=#{enum[1]}")
+
+ # TODO define_method such as "stauts_origin?"
+ define_method "#{attr}_#{enum}?" do
+ attr == enum[1]
+ end
+
+ end # end: enums.each
+
self.class_eval(%Q{
ENUMS_#{attr.upcase} = enums.collect{|item| [item[0], item[1]]}
-validates_inclusion_of attr, :in => enums.map{|e| e[1]}, :allow_nil => true
+
+validates_inclusion_of attr, :in => enums.map{|e| e[1].to_i}, :allow_nil => true
+
def #{attr}_name
ENUMS_#{attr.upcase}.find{|option| option[1] == #{attr}}[0] unless #{attr}.nil?
end
})
end
end
end
+
+Object.send :include, EnumAttr::Mixin
\ No newline at end of file