2016-04-18 7 views
1

Ich benötige ein Beispiel zum Importieren einer CSV-Datei mit unterschiedlichen Attributen. Wenn ich meinen Code ausführe, erhalte ich eine Fehlermeldung, die besagt, dass das Attribut "email" für Student unbekannt ist. Die E-Mail-Attribute können von Parent stammen. Neben dem Importieren der Attribute nur für Schüler und nur für Eltern. Wie kann ich die Attribute der Eltern in die Schülerattribute importieren?CSV-Datei mit verschiedenen Attributen aus einer anderen Klasse importieren

Mein Programm Arbeit finden, wenn ich meine CSV mit den Eltern exportiert Attribute in meinem Studentenprogramm.

Jede Hilfe wäre willkommen.

Schüler Modellklasse:

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 email phone_number 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 

Studenten Controller:

def import 
    Student.import(params[:file]) 
    redirect_to root_url, notice: "student imported." 
end 
end 

Ansicht Ordner:

<h2>Import Students</h2> 

<%= form_tag import_students_path, multipart: true do %> 
    <%= file_field_tag :file %> 
    <%= submit_tag "Import" %> 
<% end %> 
+0

Bitte geben Sie Ihren Code und den Fehler ein. – Uzbekjon

+0

@Uzbekjon Ich bearbeite meinen Post mit dem Code. danke – user2803053

+0

Könnten Sie auch den Fehler stacktrace hinzufügen? – Uzbekjon

Antwort

0

Das erste, was ich beraten Sie ist 'Ihr Modell-Code halten dünn' . Die beste Vorgehensweise ist es, Ihr Modell nur für Daten verantwortlich zu machen, sonst veilchen es SRP.

class ImportStudentsService 
    SUPPORTED_TYPES = ['.csv', '.xls', '.xlsx'].freeze 
    STUDENT_ATTRIBUTES = %w(
    parent_id first_name last_name 
    age workshop interest registration_date 
).freeze 

    PARENT_ATTRIBUTES = %w(email phone_number email).freeze 

    def initialize(file) 
    @file = file 
    end 

    def call 
    import 
    end 

    private 

    def import 
    spreadsheet.each do |row| 
     student = Student.find_or_initialize_by(id: row['id']) 
     parent = student.parent || student.build_parent 
     student.attributes = row.slice(*STUDENT_ATTRIBUTES) 
     parent.attributes = row.slice(*PARENT_ATTRIBUTES) 
     student.save! 
     parent.save! 
    end 
    end 

    def spreadsheet 
    unless SUPPORTED_TYPES.include?(File.extname(@file.original_filename)) 
     raise "Unknown file type: #{@file.original_filename}" 
    end 
    Roo::CSV.new(@file.path) 
    end 
end 

In Controller

def import 
    ImportStudentsService.new(params[:file]).call 
    redirect_to root_url, notice: "student imported." 
end 

Es ist nicht 100% arbeiten Code, aber die Grundidee ist hier vorgestellt.

+0

ich mit etwa halten mu Modellklasse Code dünn, jedoch ist es möglich, vereinbaren Hilf mir bei der Art, wie ich meinen Programmcode habe. Können Sie mir ein Beispiel geben, wie man Elternattribute in die Schülerattribute importiert? – user2803053

+0

Ich habe zwei Konstanten definiert, die die Attribute "Schüler" und "Eltern" behalten, das Mapping geschieht hier. Denkt, dass Beispiel bereits einige Daten in Elternmodell importiert. – mixan946

+0

ich bekomme eine Fehlermeldung keine implizite Umwandlung von String in Integer, wenn ich Ihre Def-Import-Methode verwendet – user2803053