Пользовательская упаковка 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
Другие вопросы по тегам