2017-07-31 82 views
0

我有一個哈希店如下:使用Rails 5屬性API使用哈希虛擬屬性

store :order_details, accessors: %w{item_name, external_id, total......etc}, coder: JSON 

我使用一個lib類的其他地方有幾個方法反序列化這一個Ruby對象中它驗證/操作

我想利用導軌5屬性的API,而不是這樣我就可以直接有:

attribute :order_details, Type::OrderDetailType.new 

(再加上它會更容易驗證添加到EA ch字段在我的哈希)

我見過examples online爲簡單的虛擬屬性(字符串,整數等)使用rails5的屬性API,但沒有遇到任何有關如何實現它的哈希屬性。 如果有人能指出我正確的方向,將不勝感激。

回答

1

擴展Type::OrderDetailTypeActiveRecord::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 

文件:http://edgeapi.rubyonrails.org/classes/ActiveRecord/Attributes/ClassMethods.html

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

+0

感謝,你也應該知道,如果有一個在建造/推薦的方法在鑄造/保存屬性之前驗證屬性(比如'value'在上面的例子中是一個散列),除了在cast方法中手動驗證每個關鍵字? – L457

+0

按照他們的文檔,他們只在cast方法內部進行驗證 – emaillenin