Ruby:将数组中的每个元素用双引号括起来

6

I have a following string :

a = "001;Barbara;122"

我将其分割成字符串数组:
names = a.split(";")
names = ["001", "Barbara", "122"] 

我应该如何让每个元素额外包含 '' 引号?结果应该是


names = ["'001'", "'Barbara'", "'122'"]

我知道这听起来很奇怪,但我需要它用于Ruby on Rails中的数据库查询。由于某种原因,如果我的名称在""引号中,我无法访问数据库记录。虽然我在数据库中有mk1==0006,但Rails似乎不想访问它。但是,它确实可以访问1222。

sql = "SELECT mk1, mk2, pk1, pk2, pk3, value_string, value_number FROM infos WHERE mk1 in (0006) AND value_string ='männlich';"         
recs = ClinicdbInfo.find_by_sql(sql)     
=> [] 

sql = "SELECT mk1, mk2, pk1, pk2, pk3, value_string, value_number FROM infos WHERE mk1 in (1222) AND value_string ='männlich';"         
recs = ClinicdbInfo.find_by_sql(sql)     
 => [#<Info mk1: "1222", mk2: "", pk1: "Information allgemein", pk2: "Geschlecht", pk3: "Wert", value_string: "männlich", value_number: nil>] 

所以,我只需要将names的每个元素用额外的''引号括起来。
3个回答

22
names.map{ |e| "'" + e + "'" }
=> ["'001'", "'Barbara'", "'122'"]
names.map{ |e| "'#{e}'" }
=> ["'001'", "'Barbara'", "'122'"]

3

您不应该手动将参数连接到SQL字符串中;相反,您应该将参数传递到find_by_sql方法中。例如:

sql = "SELECT mk1, mk2, pk1, pk2, pk3, value_string, value_number FROM infos WHERE mk1 in (?) AND value_string = ?"         
recs = ClinicdbInfo.find_by_sql [sql, 1222, "männlich"]

这样,Rails 将会处理必要的类型转换和转义以防止 SQL 注入。


0

我同意@jesenko的观点,你不应该构建SQL查询,而是让AR进行类型转换和转义输入以防止SQL注入攻击。然而,在其他用例中,你可能需要这样做。例如,当你想要将一个字符串数组插入到你的js中时。对于这些罕见的情况,我更喜欢使用以下语法:

names.map &:inspect    # =>  ["\"001\"", "\"Barbara\"", "\"122\""]

如果您在视图中打印此内容,应将其标记为HTML安全:
names.map(&:inspect).html_safe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接