2017-03-10 71 views
2

我正在导入CSV并使用ActiveRecord创建行。该CSV是:显示相同的Ruby字符串不相等,为什么?

first_name,middle_name,last_name,degrees,email,induction_year (ie 2017),"induction_type (options: alumni, associate, faculty, honorary, student)" 
John,Middle,Doe,"BA, MPH",[email protected],2017,alumni 

我对导入方法看起来是这样的:

def import 
    CSV.foreach(@file.path, headers: true, header_converters: lambda {|field| field.partition(" ").first }, col_sep: ',') do |row| 
    member_params = row.to_hash 
    Member.create!(member_params) 
    end 
end 

但它抛出ActiveModel::UnknownAttributeError: unknown attribute 'first_name' for Member.编辑:这不是与会员一个问题,我可以创建成员,你会喜欢的东西期待Member.create!(first_name: 'test')

打开一个撬,我得到这个反馈:

[1] pry(#<InducteesUpload>)> member_params 
=> {"first_name"=>"John", 
"middle_name"=>"Middle", 
"last_name"=>"Doe", 
"degrees"=>"BA, MPH", 
"email"=>"[email protected]", 
"induction_year"=>"2017", 
"induction_type"=>"alumni"} 
[2] pry(#<InducteesUpload>)> member_params.keys.first == "first_name" 
=> false 
[3] pry(#<InducteesUpload>)> member_params.keys.first.encoding 
=> #<Encoding:UTF-8> 

添加更多:

[1] pry(#<InducteesUpload>)> member_params.keys 
=> ["first_name", 
    "middle_name", 
    "last_name", 
    "degrees", 
    "email", 
    "induction_year", 
    "induction_type"] 

[2] pry(#<InducteesUpload>)> member_params["first_name"] = "test" 
=> "test" 
[3] pry(#<InducteesUpload>)> member_params 
=> {"first_name"=>"John", 
"middle_name"=>"Middle", 
"last_name"=>"Doe", 
"degrees"=>"BA, MPH", 
"email"=>"[email protected]", 
"induction_year"=>"2017", 
"induction_type"=>"alumni", 
"first_name"=>"test"} 

这不是与会员的你可以用上面的古怪看到的一个问题。但如果你真的想要的话会发布。

所以问题是在这里透露:

[6] pry(#<InducteesUpload>)> member_params.keys.first.bytes 
=> [239, 187, 191, 102, 105, 114, 115, 116, 95, 110, 97, 109, 101] 
[7] pry(#<InducteesUpload>)> "first_name".bytes 
=> [102, 105, 114, 115, 116, 95, 110, 97, 109, 101] 
+0

你可以发布'会员'的代码吗? – Kris

+0

这听起来像问题是与成员...通常,如果您要保存到数据库,它将需要从'ActiveRecord :: Base'继承。 – Kris

+0

'member_params.keys'的结果是什么? –

回答

2

我打赌unicode魔术。比较member_params.keys.first.bytes"first_name".bytes。你很可能找到一个区别。

Unicode有很多符号看起来相似,但并不相同。

+0

说到符号:在处理多字节字符串时,'codepoints'通常比'bytes'更有意义。 – Stefan

+0

@Stefan:通常是的,但在这种情况下,我认为''字节'也可以。或者甚至更好! (BOM不是有效的代码点,是吗?) –

0

我相信你有字符串和符号作为你的散列键之间的冲突。如here所述,尝试Member.create!(member_params.with_indifferent_access)

+1

给了它一个镜头,但没有奏效。正如你可以看到上面的键都是弦。 – swaincreates

相关问题