Импорт CSV с ассоциацией - PullRequest
       17

Импорт CSV с ассоциацией

0 голосов
/ 08 октября 2018

У меня 2 модели Order has_many line_items и line_item belongs_to order.Заказ был создан, и форма импорта файла находится в форме показа заказа.Я использую Roo Gem для импорта CSV, но мне не нужно, если есть другое решение.Каждая строка в таблице представляет собой новый line_item, но мне нужно сохранить order_id для каждой строки.Я открыт для всех решений.

orders / show.html.erb

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

line_items_controller.rb

  def import
    LineItem.import(params[:file])
    redirect_to root_path, notice: "Products imported."
  end

  def edit
  end

  def create
    @line_item = LineItem.new(line_item_params, :order_id => :order_id)

    respond_to do |format|
      if @line_item.save
        format.html { redirect_to @line_item, notice: 'Line item was successfully created.' }
        format.json { render :show, status: :created, location: @line_item }
      else
        format.html { render :new }
        format.json { render json: @line_item.errors, status: :unprocessable_entity }
      end
    end
  end

line_item.rb

class LineItem < ActiveRecord::Base
    require 'csv'
    belongs_to :order, inverse_of: :line_items

  def self.import(file)
    spreadsheet = Roo::Spreadsheet.open(file.path)
    header = spreadsheet.row(1)
    (2..spreadsheet.last_row).each do |i|
      row = Hash[[header, spreadsheet.row(i)].transpose]
      line_item = find_by(id: row["id"]) || new
      line_item.attributes = row.to_hash
      line_item.order_id = @order
      puts @order
      line_item.save!
    end
  end  
end

Это ошибка, которую я получаю с этим кодом ...

Validation failed: Order must exist

1 Ответ

0 голосов
/ 08 октября 2018

Вам нужно будет передать действия order на import и self.import методы.Например:

orders / show.html.erb

<%= form_tag import_line_items_path, multipart: true do %>
  # Send order_id via hidden_field_tag
  <%= hidden_field_tag :order_id, params[:id] %>
  <%= file_field_tag :file %>
  <%= submit_tag "Import" %>
<% end %>

line_items_controller.rb

def import
  order = Order.find(params[:order_id])
  LineItem.import(params[:file], order)
  redirect_to root_path, notice: "Products imported."
end

line_item.rb

def self.import(file, order)
  spreadsheet = Roo::Spreadsheet.open(file.path)
  header = spreadsheet.row(1)
  (2..spreadsheet.last_row).each do |i|
    row = Hash[[header, spreadsheet.row(i)].transpose]
    line_item = find_by(id: row["id"]) || new
    line_item.attributes = row.to_hash
    line_item.order_id = order.id
    puts order
    line_item.save!
  end
end  
...