有没有办法让ActiveRecord使用AR查找器在((1,2),(3,4))中写'WHERE(a,b)''

时间:2010-02-06 18:18:51

标签: ruby-on-rails activerecord

有没有办法让ActiveRecord使用AR查找器在((1,2),(3,4))中写'WHERE(a,b)'。

我会想

Widget.find(:all, :conditions => ['(a,b) in (?)', [[1,2][3,4]]])

但内部数组转换为YAML?!?!现在我正在使用find_by_sql。有没有更好的方法来写这个?

2 个答案:

答案 0 :(得分:2)

你可以这样做:

Widget.all(:conditions => ["(a,b) in ((?),(?))", [1,2], [3,4]])

虽然如果你有一个可变数量的值,这并不理想。听起来像ActiveRecord补丁的好机会!

更新:针对可变数量的值的kludge。仍然比做find_by_sql更好...但是你是对的,它应该由AR原生支持。

values = [[1,2],[3,4]]
Widget.all(:conditions => ["(a,b) in (#{Array.new(values.length,'(?)').join(',')})", *values])

答案 1 :(得分:0)

根据您需要的动态程度,您可以始终使用字符串进行操作,如下所示:

Widget.all(:conditions => ["(a,b) in ((1,2), (3,4))"])

这至少可以避免您进行find_by_sql通话。你还可以使用OR运算符来拆分两个数组吗?