如何在导入CSV文件时向哈希添加其他字段?

时间:2016-03-02 22:54:59

标签: ruby-on-rails csv associations

我有一个包含字段的表:

  • location_cd
  • dept_no
  • acct_no
  • 金额
  • s_dt
  • fs_dt
  • CCODE

我需要导入一个仅包含四个字段的CSV:dept_noamountacct_noccode

我正在使用CSV.foreach循环导入。当用户在单击导入按钮之前选择要导入的文件时,他们将选择s_dtfs_dt的日期。

在浏览循环时,需要将这些选定日期添加到s_dt字段和fs_dt字段。

此外,我还有第二个表格,其中只包含2个字段location_cdccode。在我的循环中,我需要遍历每一行并将Table1中的location_cd更新为与Table2 location_cd相同,其中Table2中的ccode与Table1中的ccode匹配。

在Table1中,我有belongs_to:Table2,在table2中我有has_many:Table1。

class Financial < ActiveRecord::Base
    belongs_to :financial_loc_ccode

    require 'csv'

    def self.import(file)
        CSV.foreach(file.path, headers: true, row_sep: :auto, col_sep: "\t") do |row|
            financial_hash = row.to_hash
            location = FinancialLocCcode.where(ccode: financial_hash["ccode"])

            financial_hash[:location_cd] = location
            Financial.create!(financial_hash)
        end
    end
end

这是我的模型,我收到此错误消息

ERROR: value too long for type character varying(4) : INSERT INTO "financials" ("acct_no", "amount", "dept_no", "ccode", "location_cd") VALUES ($1, $2, $3, $4, $5) RETURNING "id" (see image) 

enter image description here

此外,我还没有丝毫知道从哪里开始更新s_dtfs_date

我是铁轨的初学者,而且是我的头脑。任何帮助将非常感激。如果需要更多信息,请告诉我,我可以提供更多信息。

1 个答案:

答案 0 :(得分:0)

您看到的错误似乎告诉您,您尝试插入数据库的值太大/超出了列的限制。

根据您从错误中看到的内容,您尝试设置的列上的数据类型为character varying(4)。这意味着您可以插入该列的字符串长度为4个字符。

调试时要尝试的几件事情:
1。查看您的数据库架构并确定哪些列具有这些约束 - 这将为您提供跳跃点。你会说,“好吧,现在我知道哪一根柱子正在塞进 - 我想把它放在那里?”

2。Rails console中逐行运行代码。检查INSERT语句并仔细检查你想要填充到borking列中的东西,确实是你想要放在那里的东西。如果是,请考虑是否需要更改列的约束。如果不是,那就不要把它放在那里!

3. 调试时不要害怕puts语句。在循环的每一步,puts financial_hash。然后在你的控制台中运行循环 - 你的哈希是你认为的吗?

我知道除了“尝试多调试一下”之外,我没有给你一些具体的建议,但希望这是一个很好的起点。祝你好运!