Rails - 如何在加载父项时按条件加载嵌套属性?
Rails - How to load nested attributes by condition while loading parent?
我有两个模型,即 Invoice 和 InvoiceDetails。一个 发票有很多 invoiceDetails。
现在,当我加载 invoice 时,它还会通过关联加载 invoiceDetails 属性。 invoiceDetails 模型有一个属性 is_hide,我想加载这些嵌套属性 where is_hide = 0, 加载 发票.
发票管理员:
class Api::V1::InvoicesController < ApplicationController
respond_to :json
def index
company_id = params[:company_id]
if company_id
invoices = Invoice.where(company_id: company_id)
render json: invoices, status: 200
else
render json: { errors: "Company ID is NULL" }, status: 422
end
end
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
def create
Rails.logger.debug invoice_params.inspect
invoice = Invoice.new(invoice_params)
if invoice.save
render json: invoice, status: 201
else
render json: { errors: invoice.errors }, status: 422
end
end
def update
invoice_id = params[:id]
invoice = Invoice.find(invoice_id)
if invoice.update(invoice_params)
render json: invoice, status: 200
else
render json: { errors: invoice.errors }, status: 422
end
end
def invoice_params
invoice_params = params.require(:invoice).permit(:total_amount,:balance_amount, :customer_id, :totalTax, :totalDiscount, :bill_date,:company_id, { invoice_details: [:id,:invoice_id,:product_id,:quantity, :discount, :subtotal, :tax] })
invoice_params[:invoiceDetails_attributes] = invoice_params.delete :invoice_details
invoice_params.permit!
end
end
这是我加载发票的方式:
getInvoice : {
url:'/api/v1/companies/:company_id/customers/:customer_id/invoices/:id',
method: 'GET',
isArray: true
}
如何在 Rails 5 中完成?
假设您正在点击的是 show
动作,您可以添加一个 where 子句,例如
def show
cust_id = params[:customer_id]
invoice_id = params[:id]
if cust_id && invoice_id
invoice = Invoice.includes(:invoice_details).where(:id => invoice_id, :customer_id => cust_id, 'invoice_details.is_hide' => 0)
render json: invoice, include: '**', status: 200
else
render json: { errors: "Customer ID or Invoice ID is NULL" }, status: 422
end
end
我有两个模型,即 Invoice 和 InvoiceDetails。一个 发票有很多 invoiceDetails。
现在,当我加载 invoice 时,它还会通过关联加载 invoiceDetails 属性。 invoiceDetails 模型有一个属性 is_hide,我想加载这些嵌套属性 where is_hide = 0, 加载 发票.
发票管理员:
class Api::V1::InvoicesController < ApplicationController
respond_to :json
def index
company_id = params[:company_id]
if company_id
invoices = Invoice.where(company_id: company_id)
render json: invoices, status: 200
else
render json: { errors: "Company ID is NULL" }, status: 422
end
end
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
def create
Rails.logger.debug invoice_params.inspect
invoice = Invoice.new(invoice_params)
if invoice.save
render json: invoice, status: 201
else
render json: { errors: invoice.errors }, status: 422
end
end
def update
invoice_id = params[:id]
invoice = Invoice.find(invoice_id)
if invoice.update(invoice_params)
render json: invoice, status: 200
else
render json: { errors: invoice.errors }, status: 422
end
end
def invoice_params
invoice_params = params.require(:invoice).permit(:total_amount,:balance_amount, :customer_id, :totalTax, :totalDiscount, :bill_date,:company_id, { invoice_details: [:id,:invoice_id,:product_id,:quantity, :discount, :subtotal, :tax] })
invoice_params[:invoiceDetails_attributes] = invoice_params.delete :invoice_details
invoice_params.permit!
end
end
这是我加载发票的方式:
getInvoice : {
url:'/api/v1/companies/:company_id/customers/:customer_id/invoices/:id',
method: 'GET',
isArray: true
}
如何在 Rails 5 中完成?
假设您正在点击的是 show
动作,您可以添加一个 where 子句,例如
def show
cust_id = params[:customer_id]
invoice_id = params[:id]
if cust_id && invoice_id
invoice = Invoice.includes(:invoice_details).where(:id => invoice_id, :customer_id => cust_id, 'invoice_details.is_hide' => 0)
render json: invoice, include: '**', status: 200
else
render json: { errors: "Customer ID or Invoice ID is NULL" }, status: 422
end
end