使用Rails 5属性api和散列虚拟属性

时间:2017-07-31 01:07:12

标签: ruby-on-rails ruby activerecord ruby-on-rails-5

我有一个哈希存储如下:

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来处理简单的虚拟属性(字符串,整数......等),但是没有遇到任何有关如何为哈希属性实现它的信息。 如果有人能指出我正确的方向,我将不胜感激。

1 个答案:

答案 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

示例:http://nithinbekal.com/posts/rails-5-features/