validates_timeliness/spec/support/test_model.rb
Adam Meehan e5bb096161 Move method generation to ActiveModel only and use type system in AR
The ActiveModel type system with extensions in ActiveRecord provide
us a lot of convenience. Some general attribute code is now moved to
ActiveModel only as the AR types provide raw value capturing
(before_type_cast) and type classes to handle type specific string
value parsing if enabled.

In my view, we need to go futher and strip out more from ActiveModel
extension but at least we should have compatibility at the moment.
2018-05-19 15:22:23 +10:00

62 lines
1.6 KiB
Ruby

module TestModel
extend ActiveSupport::Concern
extend ActiveModel::Translation
include ActiveModel::Validations
include ActiveModel::AttributeMethods
included do
attribute_method_suffix "="
cattr_accessor :model_attributes
end
module ClassMethods
def attribute(name, type)
self.model_attributes ||= {}
self.model_attributes[name] = type
end
def define_method_attribute=(attr_name)
generated_attribute_methods.module_eval("def #{attr_name}=(new_value); @attributes['#{attr_name}']=self.class.type_cast('#{attr_name}', new_value); end", __FILE__, __LINE__)
end
def define_method_attribute(attr_name)
generated_attribute_methods.module_eval("def #{attr_name}; @attributes['#{attr_name}']; end", __FILE__, __LINE__)
end
def type_cast(attr_name, value)
return value unless value.is_a?(String)
type_name = model_attributes[attr_name.to_sym]
type = ActiveModel::Type.lookup(type_name)
type.cast(value)
end
end
def initialize(attributes = nil)
@attributes = self.class.model_attributes.keys.inject({}) do |hash, column|
hash[column.to_s] = nil
hash
end
self.attributes = attributes unless attributes.nil?
end
def attributes
@attributes
end
def attributes=(new_attributes={})
new_attributes.each do |key, value|
send "#{key}=", value
end
end
def method_missing(method_id, *args, &block)
if !matched_attribute_method(method_id.to_s).nil?
self.class.define_attribute_methods self.class.model_attributes.keys
send(method_id, *args, &block)
else
super
end
end
end