class ActiveType::VirtualAttributes::Builder
Public Class Methods
new(owner, mod)
click to toggle source
# File lib/active_type/virtual_attributes.rb, line 49 def initialize(owner, mod) @owner = owner @module = mod end
Public Instance Methods
build(name, type, options)
click to toggle source
# File lib/active_type/virtual_attributes.rb, line 54 def build(name, type, options) validate_attribute_name!(name) options.assert_valid_keys(:default) add_virtual_column(name, type, options) build_reader(name) build_writer(name) build_dirty_tracking_methods(name) end
Private Instance Methods
add_virtual_column(name, type, options)
click to toggle source
# File lib/active_type/virtual_attributes.rb, line 65 def add_virtual_column(name, type, options) type_caster = TypeCaster.get(type) column = VirtualColumn.new(name, type_caster, options.slice(:default)) @owner.virtual_columns_hash = @owner.virtual_columns_hash.merge(name.to_s => column) end
build_dirty_tracking_methods(name)
click to toggle source
Methods for compatibility with gems expecting the ActiveModel::Dirty API.
# File lib/active_type/virtual_attributes.rb, line 92 def build_dirty_tracking_methods(name) return if name.to_s == 'attribute' # clashes with internal methods @module.module_eval <<-BODY, __FILE__, __LINE__ + 1 def #{name}_was virtual_attributes_were["#{name}"] end BODY @module.module_eval <<-BODY, __FILE__, __LINE__ + 1 def #{name}_changed? self.#{name} != virtual_attributes_were["#{name}"] end BODY @module.module_eval <<-BODY, __FILE__, __LINE__ + 1 def #{name}_will_change! # no-op end BODY end
build_reader(name)
click to toggle source
# File lib/active_type/virtual_attributes.rb, line 71 def build_reader(name) @module.module_eval <<-BODY, __FILE__, __LINE__ + 1 def #{name} read_virtual_attribute('#{name}') end def #{name}? read_virtual_attribute('#{name}').present? end BODY end
build_writer(name)
click to toggle source
# File lib/active_type/virtual_attributes.rb, line 83 def build_writer(name) @module.module_eval <<-BODY, __FILE__, __LINE__ + 1 def #{name}=(value) write_virtual_attribute('#{name}', value) end BODY end
validate_attribute_name!(name)
click to toggle source
# File lib/active_type/virtual_attributes.rb, line 114 def validate_attribute_name!(name) unless name.to_s =~ /\A[A-Za-z0-9_]*\z/ raise InvalidAttributeNameError.new("'#{name}' is not a valid name for a virtual attribute") end end