Rails: 如何为自定义数组使用 CollectionSerializer
Rails: how to use CollectionSerializer for custom array
我有一个从许多来源合并而来的数组。例如:
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 (undefined method `read_attribute_for_serialization' for Array:0x007fcee2290460)
如果上面的代码我不使用 to_a
但是 :
list_items.push(item.item_details)
我会遇到不同的异常:
undefined method `read_attribute_for_serialization' for Item::ActiveRecord_Associations_CollectionProxy:0x007fcee67ae
请为我解释为什么我遇到这个异常以及如何解决这个问题。
我认为这对你有用。试试看
{
data: ActiveModel::ArraySerializer.new(list_items, each_serializer: ItemSerializer).to_json
}
我找到了问题的答案。我的问题是因为我将一个数组插入到一个数组中。 Ruby 将创建 two-dimensional 数组,因此我的 CollectionSerializer
无法在这种情况下工作。 (因为我假设那是 one-dimensional 数组)。所以这里是修复:
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
希望对您有所帮助。
我有一个从许多来源合并而来的数组。例如:
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 (undefined method `read_attribute_for_serialization' for Array:0x007fcee2290460)
如果上面的代码我不使用 to_a
但是 :
list_items.push(item.item_details)
我会遇到不同的异常:
undefined method `read_attribute_for_serialization' for Item::ActiveRecord_Associations_CollectionProxy:0x007fcee67ae
请为我解释为什么我遇到这个异常以及如何解决这个问题。
我认为这对你有用。试试看
{
data: ActiveModel::ArraySerializer.new(list_items, each_serializer: ItemSerializer).to_json
}
我找到了问题的答案。我的问题是因为我将一个数组插入到一个数组中。 Ruby 将创建 two-dimensional 数组,因此我的 CollectionSerializer
无法在这种情况下工作。 (因为我假设那是 one-dimensional 数组)。所以这里是修复:
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
希望对您有所帮助。