如何删除外部数组但仍将内部元素保留在Rails SQL字符串中的数组中?

时间:2017-04-07 21:52:58

标签: ruby-on-rails ruby

我有这个数组:

array = [["1","one"], ["2","two"], ["3","three"]]

如何删除外部方括号,从数组中删除一个维度,如下所示:

array = ["1","one"], ["2","two"], ["3","three"]

我知道如果我想展平整个数组,那么我得到一个大数组,我可以使用flatten。但是,我只想摆脱外部维度,同时将内部元素保持在各自的数组中。

基本上我正在尝试获取查询:

 Phone.where(["brand_name in (?) AND os in (?) AND price_category in (?)", ["Nokia"], ["Blackberry", "Android"], ["1", "2"]])

但相反,这就是我所得到的。请注意相应列值周围还有一组数组括号。

 Phone.where(["brand_name in (?) AND os in (?) AND price_category in (?)", [["Nokia"], ["Blackberry", "Android"], ["1", "2"]]])

这是方法:

def self.checkbox_search(params_hash)
    params_array = ["brand_name", "os", "price_category"]
    column_array = []
    key_array = []
    params_hash.each do |k,v|
      if params_array.include?(k)
         column_array << v
         key_array << k + ' in (?)'
      end
    end
  joined_keys = key_array.join(" AND ") + ", " + "#{column_array}"
  Phone.where([#{joined_keys}])
end

我抓取params哈希值,并将其放入checkbox_search,它会遍历哈希并将键值放在key_array中,并将其值放入column_array },如果它们符合指定的密钥标准,则包括params_array。然后我在joined_keys中将整个字符串连接在一起,然后将joined_keys的结果放在Phone.where()字符串

3 个答案:

答案 0 :(得分:2)

你只是以错误的方式组装阵列:

Phone.where([ key_array.join(" AND ") ] + column_array)

追加 column_array个值。如果你将它们内联,那么它们将在嵌套方面被推下来。请注意#{...}在这里没有位置,用于字符串插值,它会使事情变得非常糟糕。

从技术上讲,第二个版本与第一个版本相同,因为它是如何解析和分配的:

x = [1,2],[3,4]
# => [[1, 2], [3, 4]]
x
# => [[1, 2], [3, 4]]

这种符号通常用于这样的情况:

x,y = [1,2],[3,4]
# => [[1, 2], [3, 4]]
x
# => [1, 2]
y
# => [3, 4]

没有&#34;外部尺寸&#34;你可以删除。要么你有一个数组数组,要么你有一个单数阵列。

答案 1 :(得分:1)

阅读有关拨打电话的评论,您可以尝试

array = [["1","one"], ["2","two"], ["3","three"]] 

Phone.where(brand_name: array.map(&:last))

答案 2 :(得分:1)

您的解决方案非常具有创造性,但您的任务非常简单。

def self.checkbox_search(params_hash)
  where(params_hash.slice(:brand_name, :os, :price_category))
end

如果您只想要哈希中的某些键,可以使用Hash#slice或使用参数哈希,则可以使用ActionController::Parameters#permit

绝对不需要手动构造SQL字符串。在ActiveRecord中,您可以通过以下方式创建WHERE ... AND ...条件:

Person.where(name: 'Max', awesome: true)
# or
Person.where(name: 'Max').where(awesome: true)

将数组作为键的值传递会创建WHERE ... IN ...

Person.where(name: ['Max', 'the12'])

请参阅: