2016-08-05 12 views
0

Ich arbeite an einer Engine, wo ich eine Excel-Datei mit Roo Gem analysieren. Das Problem, dem ich gegenüberstehe, ist, dass ich nicht weiß, wie man Spalten abbildet.Rails map Spalten von Excel-Datei zu db-Spalten

Für z.B. Meine db-table haben Spalten first_name, last_name, emp_id, designation usw. Aber meine Excel-Datei kann einen beliebigen Spaltennamen für z.B. es könnte fname, lname, e_id, designation sein oder es könnte FirstName, LastName, EmployeeId usw.

nun sein, wie ordne ich Daten, so dass sie in der jeweiligen Spalte gespeichert werden erhalten.

Ich habe this question überprüft, aber wie kann ich Alias ​​als meine Excel-Spaltenüberschrift kann alles sein. Wenn kann Alias ​​als bitte sagen Sie mir, wie ich das tun kann. Es ist mein erstes Mal, dass ich an Schienenmotor arbeite. Auch ich bin neu in Rubin. Jede Hilfe wäre willkommen.

+0

Anstatt dynamische Datenbankspalten verwenden, könnte es einfacher sein, die csv in einen String und speichert in der Datenbank zu serialisiert, die Art und Weise –

Antwort

1

Wenn Excel-Spaltenreihenfolge festgelegt ist als Sie Daten wie folgt speichern:

@xls = Roo::Spreadsheet.open(file, extension: :xls) 
for i in [email protected]_row 
    Table.create(first_name: @xls.row(i)[1],last_name: @xls.row(i)[2],..) 
end 

Hoffe, es wird Ihnen helfen ...

+0

Dank für die Antwort, werde ich versuchen, diese. – Sinscary

+0

willkommen, kommentieren Sie hier, wenn Sie weitere Hilfe benötigen ... –

+0

Ihre Antwort funktioniert für kleine Excel-Dateien, aber wenn es viele Spalten in db gibt, wird dieser Code größer. Gibt es eine Möglichkeit, dass 'Table.create (Vorname: @ xls.row (i) [1], Nachname: @ xls.row (i) [2], ..)' Dieser Code kann optimiert werden – Sinscary

1

Für diese Art von Sachen, die ich ein Dienstobjekt verwenden würde.

class ImportExcel 
    DEFAULT_MAPPING = { 
     excel_col_name => db_colname 
    }.freezy 

    def initialize(mapping=nil, model_class=nil) 
     @mapping = mapping || DEFAULT_MAPPING 
     @model_class = model_class || DefaultModelClass 
    end 

    def import(excel_sheet) 
     records = [] 
     header = excel_sheet.first_row 
     2.upto(excel_sheet.last_row) do |line| 
     record = @model_class.new 
     records << record 
     header.each_with_index do |name, col| 
      record[@mapping[name]]= excel_sheet.row[line][col] 
     end 
     end 
     records 
    end 
end 

# Where ever 
importer = ImportExcel.new({ a: :b , c: :d}, MyModel) 
new_records = importer.import(sheet) 
new_records.map(&:save!) 
+0

Nun, ich möchte die Daten in db speichern. Ihr Mapping scheint zu funktionieren, aber hw speichert das Array in db. – Sinscary

+0

Sie können record.save aufrufen! nach header ... end oder imorter.import (...). map (&: save!) – slowjack2k

+0

Ich habe noch einen Zweifel. Eigentlich baue ich eine Engine, also wird meine Engine nur Spalten und Daten zum Modell der App geben und dann wird meine Engine diese Daten in db speichern. Wie ordnen wir Daten in diesem Fall zu? – Sinscary