2017-03-10 141 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

相關問題