2016-08-08 4 views
0

Ich habe diese railcasts zur Generierung der CSV-Datei meines Modells bezeichnet. Zum Generieren von CSV-Datei von Produkten DatenMethode gibt Objektreferenzen anstelle von Spaltendaten aus, wenn sie als Modul enthalten sind (Rails 4.2)

#products.rb 


def self.to_csv(options = {}) 
    CSV.generate(options) do |csv| 
    csv << column_names 
    all.each do |product| 
     csv << product.attributes.values_at(*column_names) 
    end 
    end 
end 

Und funktioniert wie ein Charme. Aber ich brauche die gleiche CSV-Erzeugungsfunktion über meine App haben und so habe ich ein Modul

lib/generate_csv.rb 


module GenerateCSV 
    def self.to_csv(options = {}) 
    CSV.generate(options) do |csv| 
     csv << column_names 
     all.each do |thismodel| 
     csv << thismodel.attributes.values_at(*column_names) 
     end 
    end 
    end 
end 

und ich eingeschlossen dieses Modul in

#products.rb 
include GenerateCSV 

aber das funktioniert nicht. In der heruntergeladenen Datei gibt es keine Daten außer Objektverweisen wie #<Product:0x007fdbe6a18578>. Jede Hilfe sehr geschätzt

Antwort

2

ich Ihr Beispiel in ActiveSupport::Concern bewegt und es funktioniert. Hier ist der Code:

# app/models/reason.rb 
class Reason < ActiveRecord::Base 
    include CsvExportable 

    belongs_to :project 

    scope :fresh, -> { where("created_at > ? ", DateTime.now) } 
    scope :expired, -> { where("created_at < ? ", DateTime.now) } 
end 

# app/models/concerns/csv_exportable.rb 
module CsvExportable 
    extend ActiveSupport::Concern 

    included do 
    def self.to_csv(options = {}) 
     CSV.generate(options) do |csv| 
     csv << column_names 
     all.each do |thismodel| 
      csv << thismodel.attributes.values_at(*column_names) 
     end 
     end 
    end 
    end 
end 

[4] pry(main)> r = Reason.all 
    Reason Load (0.4ms) SELECT "reasons".* FROM "reasons" 
=> [#<Reason:0x007faf5c15e3d0 id: 1, name: "r1", project_id: nil, created_at: Thu, 30 Jun 2016 07:50:10 UTC +00:00, updated_at: Thu, 30 Jun 2016 07:50:10 UTC +00:00, deleted: false>, 
#<Reason:0x007faf5c15e240 id: 3, name: "r2", project_id: 1, created_at: Fri, 22 Jul 2016 04:53:11 UTC +00:00, updated_at: Fri, 22 Jul 2016 04:53:11 UTC +00:00, deleted: false>] 
[5] pry(main)> r.to_csv 
    Reason Load (0.4ms) SELECT "reasons".* FROM "reasons" 
=> "id,name,project_id,created_at,updated_at,deleted\n1,r1,,2016-06-30 07:50:10 UTC,2016-06-30 07:50:10 UTC,false\n3,r2,1,2016-07-22 04:53:11 UTC,2016-07-22 04:53:11 UTC,false\n" 
[6] pry(main)> 
+0

Danke, was denken u der Grund, es funktioniert nicht, wenn gerade als Modul enthalten? –

+0

@Maverick Tan sagte, warum es nicht funktioniert, also hat er recht. Sorge ist nur ein "Schienen-Weg". Wenn Sie self.to_csv aus 'included'-Block verschieben, erhalten Sie die Objektreferenzen genau wie in Ihrer Frage. – retgoat

+0

Sie haben Recht, @retgoat, danke! – Nathan

0

erweitern generateCSV statt gehören sie seit to_csv ist eine Klassenmethode

module GenerateCSV 
    def to_csv(options = {}) 
    end 
end 

#products.rb 
extend GenerateCSV 
+0

versucht und nicht funktioniert, vielen Dank für Hilfe, obwohl –

Verwandte Themen