Как трактовать значения полей jsonb как первоклассные атрибуты в сериализации? - PullRequest
0 голосов
/ 17 февраля 2019

У меня есть Rails-сервер, использующий поле jsonb postgresql.Я хотел бы использовать драгоценный камень fast_jsonapi, но я не женат на нем.

У меня есть поле jsonb, которое является моделью, которую я хочу сериализовать.Однако я не понял, как сделать из них атрибуты json (сериализовать их как первоклассных граждан). Поэтому вместо:

{  
   "attributes":{  
      "data":{  
         "title":"ok",
         "author":"masta p"
      },
      "created_at":"2019-02-16T17:40:21.477Z",
      "updated_at":"2019-02-16T17:40:21.477Z"
   }
}

мне не нужно дополнительное пространство имен 'data' ихотел бы, чтобы это было:

{  
   "attributes":{  
      "title":"ok",
      "author":"masta p"
      "created_at":"2019-02-16T17:40:21.477Z",
      "updated_at":"2019-02-16T17:40:21.477Z"
   }
}

Какой недорогой способ сделать это?

1 Ответ

0 голосов
/ 17 февраля 2019

Для fast_jsonapi это невозможно.Каждый атрибут, объявленный в классе сериализатора, отправляется активному объекту записи. здесь вы бы увидели, как библиотека сериализует данный объект.

Так что, если вы хотите сериализовать объекты jsonb в качестве первого гражданина, я думаю, у вас есть 2 способа.Сначала вы должны расширить класс FastJsonapi::Attribute, а затем переопределить метод serialize.Но я не рекомендую этот путь из-за того, что это действительно подвержено ошибкам.

Второй способ - это явное объявление полей из объекта jsonb.Для краткости, следующий обходной путь подойдет вашей проблеме, я думаю.

class TestSerializer
  include FastJsonapi::ObjectSerializer

  JSONB_ATTRIBUTES = %i[title author review_count]
  JSONB_ATTRIBUTES.each do |attr|
    attribute attr do |object|
      object.data[attr.to_s] if object.data # Protection againts nil value
    end
  end
end

Это намного лучше, чем расширение класса сериализатора.

...