将数组分隔为带引号的逗号分隔字符串

4
我正在手动构建一个SQL查询,其中我在参数哈希中使用数组来进行SQL IN语句,例如:(“WHERE my_field IN('blue','green','red')”)。因此,我需要将数组的内容输出到一个字符串中,其中每个元素都是单引号和逗号分隔(并且没有结束逗号)。
因此,如果数组是:my_array = ['blue','green','red'] 我需要一个看起来像这样的字符串:"'blue','green','red'" 我对Ruby / Rails还不太熟悉,但想到了一个可行的解决方案:
if !params[:colors].nil?
   @categories_array = params[:colors][:categories]
   @categories_string =""
   for x in @categories_array
      @categories_string += "'" + x + "',"
   end
   @categories_string.chop!     #remove the last comma
end

所以,我做得不错,但是想知道一个更加恰当和简洁的方法是什么样子?


@user548744 不要忘记将正确的答案标记为已接受! - Jacob Relkin
5个回答

13

使用mapjoin:

@categories_string = @categories_array.map {|element|
  "'#{element}'"
}.join(',')

如果我想让这个数组呈现这种形式,应该写什么代码。 蓝色 绿色 红色 - regmiprem

5

您是否打算将此字符串传递给ActiveRecord的查找方法?

如果是这样,ActiveRecord会自动处理它:

categories_array = ['foo', 'bar', 'baz']
Model.find(:all, :conditions => ["category in (?)", categories_array])

# => SELECT * FROM models WHERE (category in ('foo', 'bar', 'baz'))

希望这能帮到您。

谢谢 - 非常感谢。在这种情况下,我有一个搜索表单,并且(因为我没有能力在我们的内部工作服务器上安装Sphinx),我正在使用MySQL全文搜索。我还没有看到一种方法可以在需要使用MySQL“WHERE MATCH”时使用ActiveRecord查找方法,因此我假设必须手动构建查询字符串并使用“find_by_sql”方法。不过,这对我来说仍然非常新。 - Reno

5

这个功能已经内置在ActiveRecord中:

Model.where(:my_field => ['blue','green','red'])

0

如果您正在使用参数哈希,则无需进行任何特殊操作:

Model.all(:conditions => {:category => @categories_array})
# => SELECT * FROM models WHERE (category in ('foo', 'bar', 'baz'))

0

Rails(实际上是Rails框架的一部分:ActiveSupport)提供了一个非常好用的 Array#to_sentence method 函数。

如果你正在使用Rails或ActiveSupport,你可以调用该函数。

['dog', 'cat', 'bird', 'monkey'].to_sentence # "dog, cat, bird, and monkey"

这不会添加引号。 - Arnold Roa

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