【问题标题】:Joining array of strings into a quoted comma-separated list将字符串数组连接到带引号的逗号分隔列表中
【发布时间】:2016-03-24 21:31:19
【问题描述】:

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

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

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

"`one`, `two`, `three`"

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

arr = arr.join "`, `"
arr = arr.prepend "`"
arr = arr += "`"

但我想知道是否有更简洁的方法来实现这一点,或者除了join 之外是否还有更好的功能可以使用。最好是单排。

【问题讨论】:

    标签: arrays ruby string


    【解决方案1】:

    我会使用mapjoin

    arr = ["one", "two", "three"]
    
    arr
      .map { |e| "`#{e}`" }
      .join(', ')
    

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

    arr.map { |e| "`#{e}`" }.join(', ')
    

    现在,我不完全确定这一点,但看起来您可能正在使用它来引用 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
    

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

    • 有一些方法可以解决这个问题并进行SQL injection 攻击。这很糟糕,任何人都可以读取或销毁数据。
    • 即使只是供个人使用,也最好以“正确的方式”进行操作,因为迟早您会遇到数据包含 ` 或其他您没有想到的特殊字符的问题,此时您的程序会中断。

    【讨论】:

    • 是的,我这样做是为了转义 SQL 查询的变量列表。我将看看 SQLite3 gem 是否提供了正确的转义功能。我会使用参数化查询,但我不确定它们是否支持用于IN SQL 子句的动态大小列表。
    • @randynewfield 我的预感是正确的 :-) 查看更新的答案。使用起来真的很简单(可能比更简单!)
    • 不幸的是,我不能使用这样的参数化查询,因为我需要制作字符串的子句在 IN 子句 (techonthenet.com/sqlite/in.php) 中使用,其中我的数组长度和不能硬编码为参数化的常量数量的变量。
    • @randynewfield 我可能会推荐 active_record 它会在哈希语法中处理这个问题,例如Some Object.where(some_column: arr)。这是 Rails 查询的基础,并且非常健壮。它可能需要更正式的开发,但即使在 Rails 之外,我也发现它非常有用。
    • 这个答案描述了如何绑定一个数组:stackoverflow.com/questions/17605253/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-30
    • 1970-01-01
    • 2017-04-10
    相关资源
    最近更新 更多