【问题标题】:How to sort by attributes in rails serializer?如何在rails序列化程序中按属性排序?
【发布时间】:2021-07-22 06:46:34
【问题描述】:

正如标题所说,我应该如何使用 Rails 中 Active Model Serializer 中的属性对 api 进行排序?

我有一个由购物清单组成的示例 api。它包括产品名称、位置和价格。在我的序列化器中

class ShoppingListSerializer < ActiveModel::Serializer
  attributes :id, :name, :location, :price

  def id
    Product.find(object.product_id).id
  end

  def name
    Product.find(object.product_id).name
  end

  def location
    Product.find(object.product_id).location
  end

  def price
    Product.find(object.product_id).price
  end
end

我想使用属性 name 对其进行排序。我该怎么做?谢谢。

【问题讨论】:

  • 对api进行排序,这是什么意思?此外,在每种方法中都执行Product.find... 似乎效率很低。您在这里真正要解决的问题是什么?
  • 这听起来像是教科书 X & Y 问题。您不会在序列化程序中排序。您也不应该进行数据库查询。序列化程序实际上就像一个视图。它从控制器获取数据并将其转换为 JSON。

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


【解决方案1】:

在您的示例中,您不是在序列化购物清单,而是在序列化产品。

我建议这样做:

在控制器中 -

def serialize_products_from(shopping_list)
  ActiveModelSerializers::SerializableResource.new(
    shopping_list.products,
    each_serializer: ProductSerializer
  )
end

记住你的 shopping_list 对象有很多产品。 如果属性 id/name/location/price 是 Product 表上的数据库列,则不需要为它们定义方法。只有在需要操作序列化程序给出的输出时才定义方法。

在序列化器中 -

class ProductSerializer < ActiveModel::Serializer
  attributes :id, :name, :location, :price

  def price_in_dollars
    "#{object.price / 100},#{object.price % 100}"
  end
end

您可以稍后尝试对结果进行排序

serialize_products_from(shopping_list).sort

或者尝试从这里开始使用其他一些解决方案。

【讨论】:

    猜你喜欢
    • 2016-07-25
    • 2019-09-19
    • 1970-01-01
    • 1970-01-01
    • 2012-07-12
    • 2017-10-09
    • 2015-12-06
    • 2013-04-23
    • 1970-01-01
    相关资源
    最近更新 更多