Rails:如何将CollectionSerializer用于自定义数组

时间:2017-02-06 08:34:35

标签: ruby-on-rails arrays active-model-serializers

我有一个从许多来源合并的数组。例如:

        list_items = []
        items.each do |item|
          # I convert details list to array by using to_a
          list_items.push(item.item_details.to_a)
        end

然后我使用该自定义数组并序列化:

        {
            data: ActiveModel::Serializer::CollectionSerializer.new(
                list_items,
                serializer: ItemSerializer)
        }

然后我遇到异常:

  

NoMethodError(数组的未定义方法`read_attribute_for_serialization':0x007fcee2290460)

如果上面的代码我不使用to_a但是:

          list_items.push(item.item_details)

我会遇到不同的例外:

  

项目的未定义方法`read_attribute_for_serialization':: ActiveRecord_Associations_CollectionProxy:0x007fcee67ae

请为我解释为什么我遇到这个例外以及如何解决这个问题。

2 个答案:

答案 0 :(得分:1)

我找到了问题的答案。我的问题是因为我将数组插入数组。 Ruby将创建二维数组,因此我的CollectionSerializer在这种情况下无法工作。 (因为我认为这是一维数组)。所以这是修复:

    list_items = []
    items.each do |item|
      # I convert details list to array by using to_a
      # list_items.push(*item.item_details.to_a)

      # using * operator before array for flattening array
      list_items.push(*item.item_details)
    end

在此之后,一切都像魅力一样。

    {
        data: ActiveModel::Serializer::CollectionSerializer.new(
            list_items,
            serializer: ItemSerializer)
    }

您可以在此处获得更多详细信息:unary operator for array

希望得到这个帮助。

答案 1 :(得分:0)

我认为这对你有用。尝试一下

{
 data: ActiveModel::ArraySerializer.new(list_items, each_serializer: ItemSerializer).to_json 
}