2017-07-08 5 views
1

ich zwei Modelle haben nämlich Invoice und InvoiceDetails und:Rails - Wie löscht man assoziierte Attribute beim Aktualisieren eines Parents?

class Invoice < ActiveRecord::Base 

    has_many :invoice_details 

Jetzt ein Benutzer hat die Möglichkeit, bearbeiten eine Rechnung, so kann er entfernen die invoiceDetails Attribute vom Rechnung. Also wie kann ich löschen diese verschachtelte Attribute der RechnungDetails Modell beim Aktualisieren der invoice(parent) Modell.

Ich benutze AngularJS für Client-Seite.

Die Update-Aktion:

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 

Die Rechnung Modell

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

Das InvoiceDetails Modell

class InvoiceDetail < ApplicationRecord 
    belongs_to :invoice 
    belongs_to :product 
end 
+0

Sie benötigen _destroy Parameter wahr oder falsch für jeden InvoiceDetail Objekt zu übergeben. – Vishal

+0

Können Sie bitte die Antwort mit einem Beispiel erläutern – Paras

Antwort

0

Für den Fall, dass jemand daran festhält, hier ist, was ich getan habe. Ich fügte ein Attribut hinzu is_hide in InvoiceDetails (Kind) Modell. Wenn ein Benutzer ein InvoiceDetails-Attribut löscht, wird die Eigenschaft is_hide auf true gesetzt.

Im Rechnung (parent) Modell, verwendete ich die BEFORE_SAVE Rückruf und iteriert durch die InvoiceDetails Attribute und genannte mark_for_destruction wo is_hide = true. Diese

ist, wie mein Rechnungsmodell aussieht:

class Invoice < ApplicationRecord 
    has_many :invoiceDetails, inverse_of: :invoice, dependent: :destroy, autosave: true 
    belongs_to :customer 
    accepts_nested_attributes_for :invoiceDetails 

    before_save :mark_children_for_removal 

    def mark_children_for_removal 
    invoiceDetails.each do |child| 
     child.mark_for_destruction if child.is_hide? 
    end 
    end 

end 
Verwandte Themen