Sha256: 02dd491ecbd26967b2479c0200c666f8530005278b3782eb347d4c5a9730faae
Contents?: true
Size: 1.75 KB
Versions: 1
Compression:
Stored size: 1.75 KB
Contents
# encoding: utf-8 module CodeBox module ActsAsCode @opts = {} def self.[](options={}) @opts = options self end def self.included(base) base.extend(ClassMethods) base.acts_as_code(@opts) end module ClassMethods DefaultOptions = { :code_attribute => :code, :polymorphic => false, :position_attribute => :position, :uniqueness_case_sensitive => false } def acts_as_code(options={}) opts = DefaultOptions.merge(options) code_attr = opts[:code_attribute] position_attr = opts[:position_attribute] case_sensitive = opts[:uniqueness_case_sensitive] order_expression = if position_attr then "coalesce(#{position_attr.to_s}, #{code_attr.to_s})" else code_attr.to_s end class_eval <<-CODE validates_presence_of :#{code_attr} validates_uniqueness_of :#{code_attr}#{opts[:polymorphic] ? ', :scope => :type' : ' '}, :case_sensitive => #{case_sensitive} default_scope order('#{order_expression}') def self.initialize_cache all.inject({}) {|hash, obj| hash[obj.#{code_attr}] = obj; hash } end def self.for(code) code_cache[code] end def hash (self.class.name + '#' + #{code_attr}).hash end def equal?(other) other && is_a?(other.class) && #{code_attr} == other.#{code_attr} end CODE instance_eval <<-CODE class << self def code_cache @code_cache ||= initialize_cache end end CODE end end end end
Version data entries
1 entries across 1 versions & 1 rubygems
Version | Path |
---|---|
code-box-0.0.1 | lib/code-box/acts_as_code.rb |