我有一个哈希存储如下:
store :order_details, accessors: %w{item_name, external_id, total......etc}, coder: JSON
我使用其他地方的lib类将其反序列化为ruby对象,其中有几个方法用于验证/操作
我想使用rails 5属性api代替,以便我可以直接使用:
attribute :order_details, Type::OrderDetailType.new
(加上它会更容易为我的哈希中的每个字段添加验证)
我已经看到examples online使用rails5的属性api来处理简单的虚拟属性(字符串,整数......等),但是没有遇到任何有关如何为哈希属性实现它的信息。 如果有人能指出我正确的方向,我将不胜感激。
答案 0 :(得分:1)
从Type::OrderDetailType
ActiveRecord::Type::Value
您可以覆盖强制转换和序列化方法。
def cast(value)
value
end
def serialize(value)
value
end
Money
类型的示例:
# app/models/product.rb
class Product < ApplicationRecord
attribute :price_in_cents, MoneyType.new
end
class MoneyType < ActiveRecord::Type::Integer
def type_cast(value)
# convert values like '$10.00' to 1000
end
end
product = Product.new(price_in_cents: '$10.00')
product.price_in_cents #=> 1000
Doc:http://edgeapi.rubyonrails.org/classes/ActiveRecord/Attributes/ClassMethods.html