Как сериализовать массив хешей - PullRequest
0 голосов
/ 02 декабря 2018

У меня есть контроллер, который строит массив хэша следующим образом:

product_controller.rb

    class ProductController < ApplicationController

    def product
      existing_products = Product.where(abc, deb)

      existing_products = mapped_existing_products(existing_products)

      some_other_method(existing_products)

      render status: :ok,
             json: { existingProducts: existing_products }

    end

    private

    def mapped_existing_products(existing_products)
    product_mapping = []
    existing_products.each do |product|
      product_mapping << {
        product_id: product.id,
        order_id: activity.product_order_id
      }
    end
    product_mapping
  end
end

Я новичок в ruby, но из того, что я прочитал, я должен создать сериализаторно сериализатор для модели, и у меня нет сериализатора для продукта, так как я рендерить хэш с новыми атрибутами.

Я пытался создать сериализатор, как показано ниже

class ProductMappingSerializer < ActiveModel::Serializer
  attributes :product_id, :order_id
end

и в контроллере

render json: existing_products,
           serializer: ProductMappingSerializer,
           status: :ok

end

, но когда я проверял его, я получал ошибку

undefined method `read_attribute_for_serialization' for #<Array:0x00007fa28d44dd60>

Как я могу сериализовать атрибуты хэша в визуализированном json?

1 Ответ

0 голосов
/ 02 декабря 2018

Вне Rails, один из способов сериализации объекта Ruby - это Marshal

# make array of hash
irb> a_of_h = [{}, {:a => 'a'}]
=> [{}, {:a=>"a"}]

# serialize it
irb> dump = Marshal.dump(a_of_h)
=> "\x04\b[\a{\x00{\x06:\x06aI\"\x06a\x06:\x06ET"

# bring it back
irb> back = Marshal.load(dump)
=> [{}, {:a=>"a"}]

# check that it happened
irb> back
=> [{}, {:a=>"a"}]

Это может соответствовать или не соответствовать потребностям вашего приложения.

Другой способ с JSON

irb> require 'json'
=> true
irb> j = JSON.dump(a_of_h)
=> "[{},{\"a\":\"a\"}]"

Существует также YAML

irb> require 'yaml'
=> true
irb> YAML.dump(a_of_h)
=> "---\n- {}\n- :a: a\n"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...