ruby jsonapi-serializer -返回slug而不是关系的id

s71maibg  于 2023-11-18  发布在  Ruby
关注(0)|答案(1)|浏览(148)

我使用jsonapi-serializer来序列化我的对象。
我想返回原始模型的slug以及所有关联(关系)。
product_serializer.rb

class ProductSerializer < V1::BaseSerializer
    set_id :slug
    set_type :product
    attributes :name, :description, :original_price_cents, :discounted_price_cents

    belongs_to :seller
  end

字符串
seller_serializer.rb

class SellerSerializer < V1::BaseSerializer
    set_id :slug
    set_type :seller
    attributes :average_rating, :reviews_count, :total_sold_count, :name
end


问题是,与卖家的关联是返回卖家的ID。

"data": {
            "id": "sleek-leather-keyboard-women-s-fashion-shoes",
            "type": "product",
            "attributes": {
                "name": "Sleek Leather Keyboard",
                "description": "Non qui est. Est quis molestiae.",
                "original_price_cents": 7662,
                "discounted_price_cents": 5103,
            },
            "relationships": {
                "seller": {
                    "data": {
                        "id": "1",
                        "type": "seller"
                    }
                },
            }
        },


我想隐藏卖家的id 1从上面的React。我尝试了几件事,但似乎没有帮助。任何人有任何建议?
不起作用

class ProductSerializer

  belongs_to :seller do |serializer, seller|
    serializer.slug_for(seller)
  end

  private

  def self.slug_for(relationship)
    { id: relationship.slug }
  end
end


更新:
有一个id_method_name,可以用来覆盖它。

belongs_to :seller, id_method_name: :slug


但它会选择产品的弹头,而不是卖家的弹头。

ecbunoof

ecbunoof1#

您面临的问题源于jsonapi-serializer如何处理关联。id_method_name用于指定在父对象(在本例中为Product)上调用哪个方法以获取关联的ID。但是,您希望在关联对象(Seller)上调用该方法以获取其slug作为ID。
要解决此问题,您可以覆盖关联的默认行为。以下是解决方案:
1.在ProductSerializer中使用blockbelongs_to关联。在块中,您可以显式定义关联的属性。通过指定关联的id属性,您可以控制在序列化输出中将哪个值用作关联的ID。
1.在块内部,调用关联Seller对象上的slug方法以检索其slug
下面是如何修改ProductSerializer来实现这一点:

class ProductSerializer < V1::BaseSerializer
  set_id :slug
  set_type :product
  attributes :name, :description, :original_price_cents, :discounted_price_cents

  belongs_to :seller do |object|
    { id: object.seller.slug, type: :seller }
  end
end

字符串
通过此更改,belongs_to :seller关联将在序列化输出中使用关联Seller对象的slug作为其ID。
注意事项:确保Product模型与Seller有关联(例如,Product模型中的belongs_to :seller),并且Seller模型具有slug属性或方法。

相关问题