2016-04-11 6 views
0

Verschieben einer Methode in meinem Controller (Invoices) in das entsprechende Modell und ich vermisse etwas. Ich habe versucht, folgende this und this und sogar this und es gibt kleine Probleme, die ich habe, dass ich zusätzliche Augen brauchen.Moving-Methode-Logik mit SQL zu modellieren in Schienen Projekt

Meine Arbeits-Controller-Methode ist dies.

def array_of_disbursable_invoices 
    sql = "SELECT MIN(departure_date), ch_invoice.invoice_id 
    FROM ch_invoice 
    INNER JOIN ch_trip 
    ON ch_invoice.invoice_id = ch_trip.invoice_id 
    WHERE departure_date <= (SELECT SYS_EXTRACT_UTC(SYSTIMESTAMP)FROM DUAL) 
    AND service_rendered = 0 
    AND paid = 1 
    Group By ch_invoice.invoice_id" 

    report = ActiveRecord::Base.connection.exec_query(sql) 
    render json: report 
    end 

Und ich versuche, es in das zu verwandeln.

def array_of_disbursable_invoices 
    report = report.array_of_disbursable_invoices 
    render json: report 
    end 

Mit der Logik in meinem Modell hier.

def array_of_disbursable_invoices 
    sql = "SELECT MIN(departure_date), ch_invoice.invoice_id 
    FROM ch_invoice 
    INNER JOIN ch_trip 
    ON ch_invoice.invoice_id = ch_trip.invoice_id 
    WHERE departure_date <= (SELECT SYS_EXTRACT_UTC(SYSTIMESTAMP)FROM DUAL) 
    AND service_rendered = 0 
    AND paid = 1 
    Group By ch_invoice.invoice_id" 

    ActiveRecord::Base.connection.exec_query(sql) 
    end 

Aktuelle Fehlermeldung

nicht definierte Methode `array_of_disbursable_invoices' für nil: NilClass

Antwort

1

Sie schlagen mich zu ihm (und gingen im Wesentlichen mit meiner zweiten Option). Aber ich poste das trotzdem.

Wenn Sie dies tun:

def array_of_disbursable_invoices 
    report = report.array_of_disbursable_invoices 
    render json: report 
end 

Du nennst array_of_disbursable_invoices auf einer Instanz. Aber Sie instanziieren Report - also den undefined method 'array_of_disbursable_invoices' for nil:NilClass Fehler nicht.

Also, ich denke, haben Sie zwei Möglichkeiten:

(1) Man könnte die Methode auf einer Instanz aufrufen, so etwas wie:

report = Invoice.new.array_of_disbursable_invoices 

(2) Man könnte das Verfahren eine Klassenmethode machen , etwas wie:

class Invoice < ActiveModel::Base 
    class << self 
    def array_of_disbursable_invoices 
     sql = "SELECT MIN(departure_date), ch_invoice.invoice_id 
     FROM ch_invoice 
     INNER JOIN ch_trip 
     ON ch_invoice.invoice_id = ch_trip.invoice_id 
     WHERE departure_date <= (SELECT SYS_EXTRACT_UTC(SYSTIMESTAMP)FROM DUAL) 
     AND service_rendered = 0 
     AND paid = 1 
     Group By ch_invoice.invoice_id" 

     connection.exec_query(sql) 
    end 
    end 
end 

Ich denke, ich würde empfehlen (1). Außerdem würde ich persönlich die ActiveRecord-Abfrage-Schnittstelle anstelle von SQL verwenden (vorausgesetzt, Sie haben alle Assoziationen in Ihren Modellen eingerichtet). Aber das ist eine persönliche Vorliebe.

+0

Ich werde wahrscheinlich mit dieser Antwort gehen. Du erklärst es besser als ich und es wird wahrscheinlich für die Nachwelt hilfreicher sein. Was die SQL vs ActiveRecord betrifft, so denke ich, dass meine Teamleitung nur möchte, dass ich besser verstehe, was ActiveRecord für mich tut, indem ich gezwungen werde, zuerst SQL zu erstellen. Kann das auch umgestalten. Gibt es noch andere Gründe, die erste gegenüber der letzteren zu bevorzugen? – CheeseFry

+0

Als ich Ihren Beitrag zum ersten Mal gelesen habe, dachte ich, dass es einen Grund geben könnte, warum Sie den Ansatz "report.array_of_disbursable_invoices" verwendet haben (vielleicht war da irgendwo ein 'Report'-Objekt). Ich sehe aus, als ob das nicht der Fall ist, also denke ich, dass eine Klassenmethode sauber ist. Wenn Sie zum Refactor gehen (wenn Sie sich dazu entschließen), möchten Sie vielleicht lieber einen Scope als eine Klassenmethode verwenden. Es gibt gute Beiträge zu den Vor- und Nachteilen. – jvillian

0

Verstanden mit dem folgenden Code in meinem Controller zu arbeiten.

def array_of_disbursable_invoices 
    report = Invoice.array_of_disbursable_invoices 
    render json: report 
    end 

Und das im Modell.

def self.array_of_disbursable_invoices 
    sql = "SELECT MIN(departure_date), ch_invoice.invoice_id 
    FROM ch_invoice 
    INNER JOIN ch_trip 
    ON ch_invoice.invoice_id = ch_trip.invoice_id 
    WHERE departure_date <= (SELECT SYS_EXTRACT_UTC(SYSTIMESTAMP)FROM DUAL) 
    AND service_rendered = 0 
    AND paid = 1 
    Group By ch_invoice.invoice_id" 

    ActiveRecord::Base.connection.exec_query(sql) 
    end