我有这个数组:
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()
字符串
答案 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'])
请参阅: