2016-05-18 7 views
1

pipedrive-rubyとSequelの宝石を使用してJSONハッシュのデータを取得してデータベースに格納しようとしていますが、常にすべてのセルと角括弧文字列の始めと終わり。これをどうすれば解決できますか?括弧と引用符で囲まれた変数を返すマップ関数

コード:

query_values = activities.map do |activity| 
"#{activity['id']}" 
end 

query = "INSERT INTO pd_activities (id) VALUES (#{query_values})" 
insert_ds = DB[query] 
insert_ds.insert 

データベースに挿入しようとすると、これは誤りです:

/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/sequel-4.34.0/lib/sequel/adapters/postgres.rb:186:in `async_exec': PG::SyntaxError: ERROR: syntax error at or near "[" (Sequel::DatabaseError) 
LINE 1: INSERT INTO pd_activities (id) VALUES (["72943", "73532", "7... 
+2

Michael Gaskillはすでに解決策を証明しました。 **なぜ**あなたのアプローチが失敗したか:文字列補間( '"#{....} "')を使うと、to_sメソッドは静的に補間括弧をinsdeに適用され、 'Array #to_s'は不要な括弧を生成します。 – user1934428

+0

強調するには、補間を使用して値を追加しないでください。データを追加するには、Sequelの[組み込みおよび慣用方法](http://sequel.jeremyevans.net/rdoc/files/README_rdoc.html#label-Inserting+Records)を使用します。続編は正しいことを行い、あなたはもっと幸せになるでしょう。 SequelのようなORMは、今日はかなり強力な生き物であり、それらを学ぶために支払う。シンプルなドライバーのように扱わないでください。 –

答えて

2

あなたは、SQL文に値を含めることが不適切な方法で、文字列の補間を使用しています。

これは代わりに、動作します:

query = "INSERT INTO pd_activities (id) VALUES ("#{query_values.join(', ')}")" 

activitiesの値が整数である場合、あなたはactivities.mapステップで文字列補間を回避することができます。これを行うには、単にこれを使用する:

query_values = activities.map {|activity| activity['id'] } 

activities = [12, 34, 98, 142]場合は、これが生成されます:activitiesの値は、文字列をしている場合は

"INSERT INTO pd_activities (id) VALUES (12, 34, 98, 142)" 

を、あなたの代わりにこれを行う必要があります。

query_values = activities.map {|activity| "'#{activity['id']}'" } 

activities = ["12", "34", "98", "142"]の場合、次のようになります。

"INSERT INTO pd_activities (id) VALUES ('12', '34', '98', '142')" 
+0

@Michal Gaskillに心から感謝しています。 –

+0

Sequelのクエリ/挿入ステートメントを構築する機能を利用する方が良い方法です。http://sequel.jeremyevans.net/rdoc/files/README_rdoc.html#label-Inserting+Records –

関連する問題