我需要从数组中进行 where 查询,其中数组的每个成员都是 AND 的“like”操作。例子:
SELECT ... WHERE property like '%something%' AND property like '%somethingelse%' AND ...
使用 ActiveRecord 功能很容易,where
但我不确定如何首先对其进行清理。我显然不能只创建一个字符串并将其填充到where
函数中,但似乎没有办法使用?
.
谢谢
我需要从数组中进行 where 查询,其中数组的每个成员都是 AND 的“like”操作。例子:
SELECT ... WHERE property like '%something%' AND property like '%somethingelse%' AND ...
使用 ActiveRecord 功能很容易,where
但我不确定如何首先对其进行清理。我显然不能只创建一个字符串并将其填充到where
函数中,但似乎没有办法使用?
.
谢谢
构建 LIKE 模式的最简单方法是字符串插值:
where('property like ?', "%#{str}%")
如果您将所有字符串都放在一个数组中,那么您可以使用 ActiveRecord 的查询链接并inject
构建您的最终查询:
a = %w[your strings go here]
q = a.inject(YourModel) { |q, str| q.where('property like ?', "%#{str}%") }
然后你可以q.all
或q.limit(11)
你需要做的任何事情来得到你的最终结果。
这是有关其工作原理的快速教程;您还应该查看Active Record Query Interface Guide和Enumerable
文档。
如果你有两件事 (a
和b
) 要匹配,你可以这样做:
q = Model.where('p like ?', "%#{a}%").where('p like ?', "%#{b}%")
该where
方法返回一个支持所有常用查询方法的对象,因此您可以M.where(...).where(...)...
根据需要链接调用;其他查询方法(例如order
, limit
, ...)返回相同类型的对象,因此您也可以将它们链接起来:
M.where(...).limit(11).where(...).order(...)
您有一系列要喜欢的东西,并且您想应用于where
模型类,然后应用于where
返回的内容,然后再次应用,直到您用完数组。看起来像反馈循环的东西往往需要inject
(AKAreduce
来自“map-reduce”名声):
注入(初始){| 备忘录,obj | 块 } → 对象
通过应用二元运算组合枚举的所有元素,该二元运算由命名方法或运算符的块或符号指定。
如果您指定一个块,那么对于enum中的每个元素,该块都会传递一个累加器值(memo)并且元素 [...] 结果将成为memo的新值。在迭代结束时,memo的最终值就是方法的返回值。
所以inject
获取块的输出(在我们的例子中是返回值where
)并将其作为输入提供给块的下一次执行。如果你有一个数组并且你inject
在它上面:
a = [1, 2, 3]
r = a.inject(init) { |memo, n| memo.m(n) }
那么这与此相同:
r = init.m(1).m(2).m(3)
或者,在伪代码中:
r = init
for n in a
r = r.m(n)
如果您使用的是 AR,请执行类似的操作Model.where(property: your_array)
,或者Model.where("property in (?)", your_array)
这样,所有内容都会被清理
假设您的数组是model_array,请尝试数组选择:
model_array.select{|a|a.property=~/something/ and a.property=~/somethingelse/}
当然,您可以随意使用任何正则表达式。