2016-04-20 8 views
0

Ich habe zwei Modell-Klasse namens Student and Parent. Ich versuche, eine CSV-Datei hochzuladen, die es mir erlaubt, Parent-Attribute zu verwenden: Name, E-Mail usw. in die Student-Modellklasse oder ihre CSV-Datei. Wenn ich meinen Code ausführe, erhalte ich die Fehlermeldung unbekanntes Attribut 'Name' für Student. Ich verstehe, warum ich diese Fehlermeldung erhalte, weil der Attributname nicht in den Student-Attributen ist, sondern nur in der Eltern-Klasse. Ich benötige Anweisungen zum korrekten Hinzufügen von Elternattributen zu meiner Student-Modellklasse. Ich kann die Parent-Attribute mit den Student-Attributen in die gleiche CSV-Datei exportieren, aber wenn ich diese CSV-Datei importiere, erhalte ich die Fehlermeldung, die ich bereits erwähnt habe. Jede Hilfe wäre willkommen.unbekannt Attribut 'Name' für Student für Rubin auf Schienen

Student.rb Model-Klasse:

class Student < ActiveRecord::Base 
    belongs_to :parent 

    delegate :email,:name,:phone_number,to: :parent, allow_nil: true 


    def self.to_csv 
    attributes = %w{parent_id name first_name last_name age workshop interest registration_date email } 
    CSV.generate(headers: true) do |csv| 
     csv << attributes 

     all.each do |script| 
     csv << attributes.map{ |attr| script.send(attr) } 
     end 
    end 

    end 

    def self.import(file) 
    spreadsheet = open_spreadsheet(file) 
    header=spreadsheet.row(1) 
    (2..spreadsheet.last_row).each do |i| 
     row = Hash[[header,spreadsheet.row(i)].transpose] 
    #CSV.foreach(file.path, headers: true) do |row| 

     student = find_by_id(row["id"])|| new 
     student.attributes = row.to_hash.slice(*row.to_hash.keys) 
     student.save! 
    end 
    end 


    def self.open_spreadsheet(file) 
    case File.extname(file.original_filename) 
    when ".csv" then Roo::CSV.new(file.path) 
    when ".xls" then Roo::CSV.new(file.path) 
    when ".xlsx" then Roo::CSV.new(file.path) 
    else raise "Unknown file type: #{file.original_filename}" 
    end 
    end 
end 
+1

Ich habe die gleiche Sache gemacht, den Import/Export zu Excel mit Roo. Es sollte wirklich eine Bibliothek geben, mit der wir MyModel kategorisieren können; excel_importable; excel_exportable; Ende 'und dann hat sich alles darum gekümmert. Jeder hat Freizeit und möchte das machen? ;) – alexanderbird

+0

@alexanderbird konnten Sie Ihre Datei korrekt importieren – user2803053

+0

@ndn Ich bekomme die gleiche Fehlermeldung: unbekanntes Attribut 'Name' für Student. – user2803053

Antwort

1

Sie haben name in der Liste der Attribute, die Sie ziehen von Student

def self.to_csv 
    attributes = %w{parent_id name # <-- 

Wenn Sie den folgenden Code, ist name eine der Spalten gesendet als attr

all.each do |script| 
    csv << attributes.map{ |attr| script.send(attr) } 
end 

Und script ist eine Instanz von Student von Ihrem Anruf all

Das Problem ist, dass Sie script als Variablennamen in diesem Block verwendet haben, wo es student sein soll, die Dich verwirrt hat.

es zu beheben, ändern self.to_csv innerhalb der Student Klasse, so dass die attributes aufgelistet nur die, die für Student sind. Wenn Sie nur an Datenbankspaltenwerten interessiert sind, können Sie attributes = column_names verwenden, so dass Ihnen diese in einem handlichen Array zur Verfügung stellt.

+0

danke für die Antwort, so sagen, dass ich den Schüler in der Klammer platzieren und Skript entfernen muss. – user2803053

+0

Ich ändere den Namen von Skript zu Student, jedoch bekomme ich dieselbe Fehlermeldung: unbekanntes Attribut 'name' für Student. – user2803053

+0

Antwort aktualisiert mit Anweisungen, um es zu beheben. –

Verwandte Themen