我们经常遇到这样的情况:我们拥有诸如日期,日期时间,货币等数据库字段,用户可以将其作为字符串输入数据。这意味着数据必须先进行转换,然后才能存储在数据库中。
当前,我们正在使用类似以下的概念(我们有一个相应的库,但实际上可以归结为这一点)。在此示例中,我们有一个称为valid_from
的物理日期属性。
class User < ApplicationRecord
attribute :valid_from_str, :string
def valid_from_str=(value)
begin
self.valid_from = Date.parse(value)
rescue
self.valid_from = nil
end
super
end
def valid_from_str
some_date_format_method(valid_from)
end
validate do |user|
begin
Date.parse(user.valid_from_str)
rescue
user.errors.add :valid_from_str, :invalid
end
end
end
如您所见,我们创建了一个名为valid_from_str
的附加虚拟属性,该属性为我们提供了可在表单中使用的getter和setter并验证了正确的日期格式。
尽管很多,但我认为使用Rails 5自定义属性类型一定可以做到这一点,例如:
class CustomDate < ActiveRecord::Type::Date
def cast(value)
if value.is_a?(String)
return Date.parse(value)
else
return value
end
end
end
这基本上可行,但是它不允许我们验证用户提供的原始字符串值。
是否可以使用API属性实现上述示例?