gpt4 book ai didi

mysql - Rails 从列名中包含特殊字符的 csv 创建表

转载 作者:行者123 更新时间:2023-11-29 20:27:32 24 4
gpt4 key购买 nike

我有一个 CSV 文件,正在尝试将其加载到 Rails 数据库中。一切正常,直到到达名为 BW (MB) 的列。我认为这是括号的问题,因为其他标题有空格,而且没问题。如果可能的话,我希望避免重命名原始 CSV 文件本身的 header 。

代码:

CSV.foreach(csv_file, :headers => true) do |row|
Sevonedatum.create!(row.to_hash.slice('Date', 'Market Area', 'BW (MB)'))
end

错误输出:

ActiveRecord::MultiparameterAssignmentErrors: 1 error(s) on assignment of multiparameter attributes [error on assignment ["96.26"] to BW (undefined method `BW =' for #)]

您可以看到 MultiparameterAssignment 错误指出将值分配给 BW 时出现问题,但在错误中缺少 (MB) 部分。

来自迁移文件:

class CreateSevonedata < ActiveRecord::Migration[5.0]
def change
create_table :sevonedata do |t|

t.column :'Date', :date
t.column :'Market Area', :string
t.column :'BW (MB)', :float
t.timestamps
end
end
end

最佳答案

列名中不能有括号:Rails 会尝试将列名“BW (MB)”映射到有效的 Ruby 属性名称,并且不允许使用括号。空格可以转换为下划线,但不允许使用括号。

看看 Active Record 是如何做的 convention over configuration - Rails 的关键原则之一。

Rails 允许您进行一定程度的覆盖,但您不能拥有等同于有效 Ruby 类属性的“BW (MB)”列。

您有 2 个选项 - 您都需要将这两个选项的列名称更改为“BW”。

选项 1:编辑 CSV 文件的标题,使其与列名称匹配,并相应地更改您的代码。

选项 2:保持 header 不变,但编写额外的代码以将哈希键“BW (MB)”替换为“BW”

CSV.foreach(csv_file, :headers => true) do |row|
foo = row.to_hash.slice('Date', 'Market Area', 'BW (MB)')
foo["BW"] = foo["BW (MB)"]
foo.delete("BW (MB)")
Sevonedatum.create!(foo)
end

(您可以将其优化为更少的行 - 因为您已经说过您是初学者,所以我将其变得冗长)

关于mysql - Rails 从列名中包含特殊字符的 csv 创建表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39216257/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com