这是您所看到的:
ary = ['value 1', 'value 2', 'value 3']
"#{ ary }" # => "[\"value 1\", \"value 2\", \"value 3\"]"
这是“检查”输出,由使用 Array.to_s AKA Array.inspect 引起。像我们通常看到的那样看待它:
puts "#{ ary }"
# >> ["value 1", "value 2", "value 3"]
以下是解决方法:
sql = "INSERT INTO my_table VALUES(#{ ary.map{ |i| '"%s"' % i }.join(', ') })"
# => "INSERT INTO my_table VALUES(\"value 1\", \"value 2\", \"value 3\")"
puts sql
# >> INSERT INTO my_table VALUES("value 1", "value 2", "value 3")
'"%s"' % i 是一个 String format,它用双引号将字符串包裹起来。
总而言之,如今与数据库通信的正确方法是使用体面的 ORM。 Ruby 有几个,我喜欢Sequel。 ORM 的主要胜利在于它消除了您的代码对数据库使用的语言的密切依赖性。通读它支持的list of databases,除了连接所需的 DSN 之外,无需更改代码中的任何内容。
Sequel 目前有适用于 ADO、Amalgalite、CUBRID、DataObjects、DB2、DBI、Firebird、IBM_DB、Informix、JDBC、MySQL、Mysql2、ODBC、OpenBase、Oracle、PostgreSQL、SQLAnywhere、SQLite3、Swift 和 TinyTDS 的适配器。
注意,TinyTDS 已列出。
迁移工作、查询工作、插入、删除、更新,一切都是抽象的,当您迁移到更大/其他系统时,这是一个巨大的胜利。您可以从本地 SQLite 开始,使用 MySQL 或 PostgreSQL,然后切换到 Oracle,无需更改代码,只需调整 DSN。
通读该网站的第一页以及the README,您会了解它的易用性,并想知道为什么要采用其他方式。