JsonB и attr_ json gem: Получить определенные атрибуты программно - PullRequest
0 голосов
/ 27 января 2020

Я использую поле jsonb в своем приложении Rails и установил gem attr_ json. Есть ли способ получить определенные json_attributes программно? С атрибутом "normal" rails я бы просто сделал @ instance.attribute_names. Но с attr_ json есть ли способ вернуть json_attributes?

class Vehicle < Item
  include AttrJson::Record

  attr_json :licence_plate, :string, container_attribute: "custom_attributes_indexed"
  attr_json :brand, :string, container_attribute: "custom_attributes_indexed"
  attr_json :serial_number, :string, container_attribute: "custom_attributes_indexed"
  attr_json :inventory_number, :string, container_attribute: "custom_attributes_indexed"
end

Для этого кода я хотел бы сделать что-то вроде @ vehicle.json_attribute_names и получить следующее возвращаемое

["licence_plate", "brand", "serial_number", "inventory_number"]

Ответы [ 2 ]

0 голосов
/ 05 февраля 2020

Вы можете получить определенные json_attributes с помощью: Vehicle.attr_json_registry.attribute_names

Но еще проще получить атрибуты с помощью метода rails attribute names - добавить rails_attribute: true к вашим определениям attr_ json. Это вернет все «нормальные» атрибуты и атрибуты JSON в виде массива.

[...]
attr_json :licence_plate, :string, container_attribute: "custom_attributes_indexed", rails_attribute: true
[...]
0 голосов
/ 27 января 2020

У меня есть приложение Rails, которое использует столбец JSONB в Postgres, и без каких-либо других гемов я могу вызвать следующие ключи, чтобы получить ключи ...

Учитывая модель Inspections со столбцом JSONB под названием «результаты», которые я могу сделать:

@some_inspection = Inspection.first
@some_inspection.results
  #=> {"assigned_to" => "John Smith", "inspection_date" => "2020_01_02", "passed" => "true"}

@some_inspection.results.keys
  #=> ["assigned_to", "inspection_date", "passed"]

У меня сложилось впечатление, что большое преимущество наличия столбца JSONB состоит в том, что он легко переводится для меня. У меня нет ни attr_json, ни какого-либо другого специализированного кода в моей модели. Как так много Ruby и Rails "это просто работает". Я передаю его как га sh, и он хранит его как JSON, и когда я его спрашиваю, я получаю га sh. Затем я могу использовать любые методы ha sh, например .values или .keys. Если мне нужно JSON назад, я могу сделать @some_inspection.results.to_json.

Если вы передадите ему фактический JSON, он просто сохранит текст JSON в виде строки в столбце. Затем вы можете получить JSON обратно, просто вызвав имя столбца, например:

@some_inspection.results
  #=> "{\"assigned_to\":\"John Smith\",\"inspection_date\":\"2020_01_02\",\"passed\":\"true\"}"

Но если вы хотите сделать что-то вроде .keys, вам нужно проанализировать его, так как это строка:

JSON.parse(@some_inspection.results).keys
  #=> ["assigned_to", "inspection_date", "passed"]
...