2017-01-23 4 views
0

Я следую руководству по железнодорожной сети https://www.youtube.com/watch?v=_NSBm_Q431Y&t=487s по импорту данных с использованием файла excel в базу данных с помощью gem roo. Импорт и экспорт данных работает нормально, но в то время импорта реляционных данных он показывает мне следующее сообщение об ошибке:Как импортировать реляционные данные из файла excel

unknown attribute 'PzaXCja' for Producto. 
Extracted source (around line #73): 

     row = Hash[[header, spreadsheet.row(i)].transpose] 
     producto = find_by_Clave(row["Clave"]) || new 
     producto.attributes = row.to_hash.slice(*row.to_hash.keys) 
     producto.save! 
    end 
    end 

это мои методы в модели «Producto»:

has_one :productosxpza, class_name: "Productosxpza", foreign_key: "Producto" 
    accepts_nested_attributes_for :productosxpza 

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

    def self.import(file)#importar 
    spreadsheet = open_spreadsheet(file) 
    header = spreadsheet.row(1) 
    (2..spreadsheet.last_row).each do |i| 
     row = Hash[[header, spreadsheet.row(i)].transpose] 
     producto = find_by_Clave(row["Clave"]) || new 
     producto.attributes = row.to_hash.slice(*row.to_hash.keys) #*row.to_hash.keys para rails 4 que sustituye el attr_accesible de rails 3 
     producto.save! 
    end 
    end 

    def self.open_spreadsheet(file)#importar 
    case File.extname(file.original_filename) 
    when '.csv' then Roo::Csv.new(file.path, packed: false, file_warning: :ignore) 
    #when '.xls' then Roo::Excel.new(file.path, packed: false, file_warning: :ignore) 
    when '.xlsx' then Roo::Excelx.new(file.path, packed: false, file_warning: :ignore) 
    #else raise "Unknown file type: #{file.original_filename}" 
    else raise "El formato debe ser .xlsx ó .csv" 


    end 
    end 
+0

ли печатать то, что переменная строка Его, вероятно, не в правильном формате 'producto.attributes = {ключ: значение}' –

+0

@HoMan Этот метод позволил бы мне создавать записи с ассоциациями? – LuisC

+0

@HoMan Когда я это делаю: producto.attributes = {Clave: Clave} Я получаю следующую ошибку: uninitialized constant Producto :: Clave – LuisC

ответ

1

Если бы я получил вы правильно, вы хотите установить атрибуты на productosxpza, но через producto правильно? Это должно сработать.

producto.productosxpza_attributes = { ... } 
+0

Исправить работу, импортировать данные в соответствующую таблицу, но теперь у меня небольшая ошибка при загрузке существующей записи, она не обновляет ее, как раньше, но она отправляет мне эту ошибку: не удается вставить значение NULL в столбец «Producto», table 'AdvanceControl_Copy.dbo.ProductosXPzas'; столбец не допускает нулей. Ошибка UPDATE: EXEC sp_executesql N'UPDATE [productosxpzas] SET [Producto] = @ 0 WHERE [productosxpzas]. [IDP] = @ 1; SELECT @@ ROWCOUNT AS AffectedRows ', N' @ 0 varchar (50), @ 1 int ', @ 0 = NULL, @ 1 = 165 – LuisC

+0

Я пытаюсь это обновить и productosxpza: productosxpza = find_by_Producto (строка ["Clave" ]) || new producto.productosxpza_attributes = {PzaXCja: row ["PzaXCja"], Producto: row ["Clave"]} producto.save! # (producto в productosxpza - это внешний ключ), но я получаю ту же ошибку – LuisC