将字符串数组连接到带引号的逗号分隔列表中

ran*_*eld 2 ruby arrays string

如果我有一个像这样的字符串数组:

arr = ["one", "two", "three"]
Run Code Online (Sandbox Code Playgroud)

如何将它转换为反引号引用的逗号分隔字符串,如下所示:

"`one`, `two`, `three`"
Run Code Online (Sandbox Code Playgroud)

我已经使用三个调用完成了它:

arr = arr.join "`, `"
arr = arr.prepend "`"
arr = arr += "`"
Run Code Online (Sandbox Code Playgroud)

但我想知道是否有更清洁的方法来实现这一点,或者是否有更好的功能使用join.优选地,一个衬里.

Mar*_*oij 9

我会用mapjoin:

arr = ["one", "two", "three"]

arr
  .map { |e| "`#{e}`" }
  .join(', ')
Run Code Online (Sandbox Code Playgroud)

你甚至可以把它放在一行:

arr.map { |e| "`#{e}`" }.join(', ')
Run Code Online (Sandbox Code Playgroud)

现在,我不完全确定这一点,但看起来您可能正在使用它来引用SQL查询的参数?如果你是,那么请不要这样做,但使用适当的SQL转义函数或参数化查询.


为了确认您正在使用它来进行SQL查询,更好的方法是使用(假设您正在使用sqlite3-ruby):

db = SQLite3::Database.new 'my_database.sqlite3'
arr = ["one", "two", "three"]

db.execute('select * from foo where a=? and b=? and c=?', arr) do |row|
  p row
end
Run Code Online (Sandbox Code Playgroud)

这将确保它始终有效.一开始添加反引号似乎是一个好主意,但是:

  • 有办法解决这个问题并进行SQL注入攻击.这很糟糕,允许任何人阅读或销毁数据.
  • 即使它只是供个人使用,最好以"正确的方式"进行,因为迟早你会遇到你的数据有一个或你认为没有的其他特殊角色的问题,指出你的节目中断了.