0

我使用ActiveModel :: Serializer来序列化我的json数据。 我有三个型号如下Rails ActiveModel Serializer:检索深度嵌套的ActiveRecord协会

class Invoice < ApplicationRecord 
    has_many :invoiceDetails, inverse_of: :invoice 
    belongs_to :customer 
    accepts_nested_attributes_for :invoiceDetails 
end 

class InvoiceDetail < ApplicationRecord 
    belongs_to :invoice 
    belongs_to :product 
end 

class Product < ApplicationRecord 
    belongs_to :company 
    belongs_to :category 
    belongs_to :user 
    has_many :invoice_details 
end 

该串行如下:

class InvoiceSerializer < ActiveModel::Serializer 
    attributes :id, :total_amount, :balance_amount, :created_at 
    belongs_to :customer 
    has_many :invoiceDetails 
end 


class InvoiceDetailSerializer < ActiveModel::Serializer 
    attributes :id, :quantity 
    belongs_to :product 
    belongs_to :invoice 
end 

class ProductSerializer < ActiveModel::Serializer 
    attributes :id, :name, :mrp, :sp, :cp, :stocks, :isPublished 
    has_one :category 
end 

当我取回发票我从相关invoiceDetails模式和客户模式,但属性的属性从与invoiceDetails模型关联的产品模型中缺失。

例如,如果我找回发票,这是输出:

[ 
    { 
     "id": 3, 
     "total_amount": 450, 
     "balance_amount": 350, 
     "created_at": "2017-06-27T17:02:20.000Z", 
     "customer": { 
      "id": 4, 
      "company_id": 1, 
      "name": "vivek", 
      "isActive": true, 
      "created_at": "2017-06-27T14:35:50.000Z", 
      "updated_at": "2017-06-27T14:35:50.000Z", 
      "mobile": "12345678", 
      "address": "test", 
      "pan_number": null, 
      "tin_number": null, 
      "party_name": "vipul jwelers" 
     }, 
     "invoiceDetails": [ 
      { 
       "id": 4, 
       "quantity": 1 
      }, 
      { 
       "id": 5, 
       "quantity": 1 
      } 
     ] 
    } 
] 

但是如果我找回invoiceDetail直接我得到的相关模型属性。

**[ 
    { 
     "id": 6, 
     "quantity": 5, 
     "product": { 
      "id": 4, 
      "name": "Test Prod", 
      "mrp": 150, 
      "sp": 130, 
      "cp": 100, 
      "stocks": 100, 
      "isPublished": true 
     }, 
     "invoice": { 
      "id": 4, 
      "total_amount": 3903, 
      "balance_amount": 3, 
      "created_at": "2017-07-01T07:45:02.000Z" 
     } 
    }, 
    { 
     "id": 7, 
     "quantity": 10, 
     "product": { 
      "id": 5, 
      "name": "Test Prod 2", 
      "mrp": 300, 
      "sp": 250, 
      "cp": 200, 
      "stocks": 10, 
      "isPublished": true 
     }, 
     "invoice": { 
      "id": 4, 
      "total_amount": 3903, 
      "balance_amount": 3, 
      "created_at": "2017-07-01T07:45:02.000Z" 
     } 
    } 
]** 

所以直接从发票获取嵌套属性,我需要改变我的模型之间的关系?

有人遇到同样的问题,或者你身边的任何工作都可以建议吗?

+0

https://stackoverflow.com/questions/32079897/serializing-deeply-nested-associations-with-active-model-serializers –

+0

只有我可以补充:不要全局使用它,使用'render json:data,包括:'**''你实际上需要深层嵌套。 –

+0

感谢那个工作..的人! – Paras

回答

0

如果有人被卡在这个问题,这里是我做过什么:

每当我要检索的深层嵌套的关联响应我在加入“包括*”关键字在控制器中。

例如:

def show 
    cust_id = params[:customer_id] 
    invoice_id = params[:id] 
    if cust_id && invoice_id 
     invoice = Invoice.where(:id => invoice_id, :customer_id => cust_id) 
     render json: invoice, include: '**', status: 200 
    else 
     render json: { errors: "Customer ID or Invoice ID is NULL" }, status: 422 
    end 
    end 

包括*将检索所有用于使用串行如果用于各个模型中定义的发票模型嵌套属性。