Rails ActiveModel Serializer:检索深层嵌套的ActiveRecord关联

时间:2017-07-04 10:12:05

标签: ruby-on-rails activerecord ruby-on-rails-5 activemodel active-model-serializers

我正在使用 ActiveModel :: Serializer 来序列化我的json数据。 我有三个模型如下

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"
        }
    }
]**

因此,为了直接从发票中检索嵌套属性,我是否需要更改模型之间的关系?

有人遇到过同样的问题,或者你周围的任何工作都可以提出建议吗?

1 个答案:

答案 0 :(得分:3)

如果有人遇到这个问题,我就是这样做的:

每当我想要检索深层嵌套的关联时,我都会添加&#34; include **&#34;响应期间控制器中的关键字

例如:

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

如果为各个模型定义, include * * 将使用序列化程序检索发票模型的所有嵌套属性。