2011-07-14 12 views
2

私はexcelファイルを読むためにparseexcel gemを使用しています。 コンソールにものを印刷している限り、すべてのことがうまくいきます。 私はdbにデータを挿入するrakeタスクを作成しました。 私はたくさんのcreate文を持っています。このようにRuby/Railsは文字列エラーとしてキャスト

description = row[i+1].to_s 
Coa.create(:is_group => true, :ag_gl_code => "AGL_001", :description => "#{description}") 

私の問題は 'description'変数にあります。その文字列フィールド。私はこのようなコンソールに説明を印刷する場合、それは動作し、値に

puts "{#description}" #prints the value 'Estate' 

を出力しますが、作成するには、それは私に、SQLエラー

SQLite3::SQLException: unrecognized token: "'E": 

を与えるが、クエリが細かい生成されます。文字列は一重引用符で照会され、変数をハードコードされた文字列で置き換えるとうまくいきます。私はto_sなどを使用するような多くの組み合わせを試してきましたが、動作させることはできません。

助けていただければ幸いです。おかげ

は、ここで私はそれが価値、および追加なし引用符を印刷していることに注意し、「説明」の値を記録している、ここで私のスキーマ

create_table "coas", :force => true do |t| 
    t.string "ag_gl_code" 
    t.string "description" 
    t.boolean "is_group" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
end 

で、端末ログです。

Estate 
rake aborted! 
SQLite3::SQLException: unrecognized token: "'E": INSERT INTO "coas" ("created_at", "is_group" , "description", "ag_gl_code", "updated_at") VALUES ('2011-07-14 14:48:56.616150', 't', 'Estate', 'AGL_001', '2011-07-14 14:48:56.616150') 
+1

なぜ ':description =>"#{description} "'のような文字列を補間していますか? ':description => description'だけで十分です。そして、あなたのエラーメッセージは、誰かが物事を適切に引用していないことを示しています。 –

+0

'puts" {#description} "' typo? – Dogbert

+0

私は試しました:description => description、同じエラーを出しましたが、私は:description => 'estate'を置くとうまくいきます。 (putsは私がここで作ったタイプでした) –

答えて

1

ok私はそれを修正しました。最後に。

description.to_s("latin1") 

これはsqliteエンコーディングに問題がありました。

-3

この

Coa.create(:is_group => true, :ag_gl_code => "AGL_001", :description => description) 

またはこの

Coa.create(:is_group => true, :ag_gl_code => "AGL_001", :description => h(description)) 
+0

最初に試したのは同じエラーです。もう1つは、hは定義されていません。 –

0

を試してみて問題があなたのdescription変数が文字列"'Estate'"が含まれていることのようです。一重引用符に注意してください。 これはおそらくSQLクエリが失敗する理由です。

あなたはdescription文字列から引用符を削除することによって、この問題を解決することができます

:上記の障害が発生した場合

description = row[i+1].to_s[1..-2] 

次の正規表現は、良い仕事も(多分あなたのデータは、単一引用符で囲まれていないいくつかのフィールドが含まれています)

description = row[i+1].to_s.match(/'(.*)'/)[1] 

EDIT:あなたは、データベース内の単一引用符が必要な場合、あなたはおそらく、単一引用符をエスケープする必要があります。

+0

追加の引用符がないので、最初のスニペットで文字列の一部が削除されます。 2つ目は謎のエラーです。 :S –

関連する問題