Пользовательская упаковка JSON для Virtus Model?
У меня есть объект JSON, который выглядит следующим образом:
{
"id":"10103",
"key":"PROD",
"name":"Product",
"projectCategory":{
"id":"10000",
"name":"design",
"description":""
}
}
и модель Virtus, которая выглядит следующим образом:
class Project
include Virtus.model
attribute :id, Integer
attribute :key, String
attribute :name, String
attribute :category, String #should be the value of json["projectCategory"]["name"]
end
Все отлично выстраивается, кроме как пытаться отобразить Project.category
в json["projectCategory"]["name"]
,
Таким образом, конечный объект Virtus, который я ищу, должен выглядеть так:
"id" => "10103",
"key" => "PROD",
"name" => "Product",
"category" => "design"
Прямо сейчас я создаю экземпляр модели с Project.new(JSON.parse(response))
или в основном хэш ответа JSON. Как я могу настроить отображение некоторых атрибутов Virtus в моем ответе json?
1 ответ
Так что я понял, что вы можете переопределить self.new
метод, позволяющий получить вложенные значения в хэше, который вы передаете своей модели Virtus.
Я закончил тем, что сделал следующее, которое работало отлично:
class Project
include Virtus.model
attribute :id, Integer
attribute :name, String
attribute :key, String
attribute :category, String
def self.new(attributes)
new_attributes = attributes.dup
# Map nested obj "projectCategory.name" to Project.category
if attributes.key?("projectCategory") and attributes["projectCategory"].key?("name")
new_attributes[:'category'] = attributes["projectCategory"]["name"]
end
super(new_attributes)
end
end