2016-11-10 1 views
0

Mehrere Objekte meiner Anwendung müssen als CSV exportiert werden. Basierend auf #362 Exporting CSV and Excel habe ich die folgende Funktion auf ein Modell:Wie bleibst du DRY mit einem Ruby on Rails-Modell?

### private functions definitions 
private 

def self.to_csv 
    CSV.generate(:col_sep => ";") do |csv| #Could accept a separator option 
    csv << column_names 
    all.each do |column| 
     csv << column.attributes.values_at(*column_names) 
    end 
    end 
end 

Wie kann ich, auf Modellebene, wieder verwenden diese Funktion auch für andere Modelle?

Danke.

Antwort

2

Sie ein Modul mit gängigen Methoden definieren:

module CsvHelper 
    def to_csv 
    CSV.generate(:col_sep => ";") do |csv| #Could accept a separator option 
     csv << column_names 
     all.each do |column| 
     csv << column.attributes.values_at(*column_names) 
     end 
    end 
    end 
end 

Und jetzt in Klassen verwenden:

extend CsvHelper 

P. S. Der Geltungsbereich der Klassenmethoden ändert sich nicht mit private im Bereich der Klasse.

Wenn Sie wirklich eine private Singleton-Methode haben wollen, würden Sie Folgendes:

class Foo 
    class << self 
    private 

    def bar 
    end 
    end 
end 

Jetzt bar Methode privat ist.

1

Wenn diese Anwendung mehr als ein Spielzeug-Projekt ist, würde ich empfehlen, so etwas wie das Komma Juwel mit https://github.com/comma-csv/comma

Dies wird für den Export von Hunderten gut funktionieren und soll für ein paar tausend Zeilen in Ordnung sein, wenn Sie eager- lade alle Assoziationen und es gibt keine abhängigen Abfragen.

Wenn Sie sich Gedanken über das Generieren von Dateien mit Hunderttausenden oder Millionen von Zeilen machen müssen, sollten Sie diese in einem Hintergrundjob ausführen oder, wenn Sie DB wie Postgres verwenden, die Postgres-CSV nutzen Generation, die sehr schnell ist. Es gibt ein schönes Juwel, das diesen Prozess ziemlich schmerzlos macht: https://github.com/diogob/postgres-copy