【问题标题】:Passing primary key to create action via CSV upload通过 CSV 上传传递主键以创建操作
【发布时间】:2013-08-29 00:01:36
【问题描述】:

我正在尝试通过 CSV 批量上传。这是我的控制器的导入方法:

def import
        params.permit(:id, :brand, :product, :details)
        Item.import(params[:file])
        redirect_to root_url, notice: "Products imported."
    end

然后从我的 Item 模型中调用这个 self.import 方法。

def self.import(file)
    CSV.foreach(file.path, headers: true) do |row|
       Item.create! row.to_hash
    end
end

这是我的上传表格:

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

这是我的问题:当我检查数据库中的数据时,rails 分配了一个自动递增的item_id,而不是从我的 CSV 文件传递​​的item_id。我需要为我的应用程序分配这些特定的 id,我不确定为什么我不能在创建时分配它们。查看参数,我什至没有看到我的item_id 被通过。帮助?提前致谢。

物品模型

class Item < ActiveRecord::Base

has_many    :inventory_items
has_many    :vendors, through: :inventory_items
has_many  :list_items
has_many  :shopping_lists, through: :list_items

searchable do
text :brand, :stored => true
text :details, :stored => true
text :product, :stored => true
integer :id, :references, :stored => true
end
end

【问题讨论】:

  • 你的Item 模型是什么样的?
  • 已更新项目模型。
  • item_id 存储在什么模型中?

标签: ruby-on-rails activerecord csv


【解决方案1】:

我不是 100% 确定,但我认为这可能有效。

首先你必须根据这个thread调整你的表结构来开启自动增量

create_table(:table_name, :id => false) do |t|
  t.integer :id, :options => 'PRIMARY KEY'
end

如果这不起作用,请将以下行添加到您的模型中。

set_primary_key :id

【讨论】:

  • 我无法让它在我的应用程序中工作。从我所做的额外研究来看,如果应用程序变得更复杂,听起来像这样尝试对抗 Rails 可能会导致问题。我继续在我的项目表中添加了一个product_code bigint 字段,并以此为基础运行了我的关联。目前看来工作正常。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-23
  • 1970-01-01
  • 2023-04-08
相关资源
最近更新 更多