Как объединить атрибуты из связанных моделей в один вложенный атрибут в сериализаторе? - PullRequest
0 голосов
/ 23 декабря 2018

Ниже мой json после рендеринга '@products'.Как видите, есть еще 2 вложенные модели (vendor_products и vendors).Связь между моделями продуктов и поставщиков является многим-многим, а vendor_products - это соединительные таблицы.Чего я хотел достичь, так это - вместо того, чтобы иметь вложенные модели «vendor_products» и «vendors», я просто хочу добавить «name vendor» в качестве другого атрибута в модели vendor_products.

{
   id: 1,
   barcode: 3045320001525,
   name: "xyz",
   size: "370 g",
   brand: "abc",
   img_url: "http://xyx"
   vendor_products: [
      {
        id: 1,
        v_item: "JAM101",
        vendor_id: 1,
        case_price: 72
      },
      {
         id: 2,
         v_item: "1001",
         vendor_id: 2,
         case_price: 65
      }
   ],
   vendors: [
      {
        name: "vendor_xyz"
      },
      {
        name: "vendor_123"
      }
   ]
},

Ниже приведен формат json, который я хотел:

{
   id: 1,
   barcode: 3045320001525,
   name: "xyz",
   size: "370 g",
   brand: "abc",
   img_url: "http://xyx"
   vendor_products: [
      {
        id: 1,
        v_item: "JAM101",
        vendor_id: 1,
        vendor_name: "vendor_xyz",
        case_price: 72
      },
      {
         id: 2,
         v_item: "1001",
         vendor_id: 2,
         vendor_name: "vendor_abc",
         case_price: 65
      }
   ],

Вот мои классы сериализатора:

class ProductSerializer < ActiveModel::Serializer
 attributes :id, :barcode, :name, :size, :brand, :img_url

 has_many :vendor_products
 has_many :vendors
end

class VendorProductSerializer < ActiveModel::Serializer
 attributes :id, :v_item, :vendor_id, :case_price
 belongs_to :product
 belongs_to :vendor
end

class VendorSerializer < ActiveModel::Serializer
 attributes :name
 has_many :products
 has_many :vendor_products
end

1 Ответ

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

Попробуйте добавить пользовательский атрибут в сериализаторе vendor_products,

class VendorProductSerializer < ActiveModel::Serializer

 attributes :id, :v_item, :vendor_id, :case_price, :vendor_name
 belongs_to :product
 belongs_to :vendor

 def vendor_name
   object.vendor.name #object is current vendor_product object get name from that
 end
end
...