代码之家  ›  专栏  ›  技术社区  ›  Samuel Danielson

有没有办法让ActiveRecord使用AR finders写“WHERE(a,b)in((1,2),(3,4))”

  •  3
  • Samuel Danielson  · 技术社区  · 15 年前

    有没有办法让ActiveRecord使用AR finders写“WHERE(a,b)in((1,2),(3,4))”。

    我想

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

    但是内部数组被转换成YAML?!?!现在我正在使用find_by_sql。有更好的方法写这个吗?

    2 回复  |  直到 15 年前
        1
  •  2
  •   Brad G.    15 年前

    你可以这样做:

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

    尽管如果值的数目可变,这并不理想。听起来是一个很好的机会,一个补丁到ActiveRecord!

    更新: 一个值的可变数目的kludge。仍然比使用sql查找要好…但是您是对的,它应该由AR本机支持。

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

    根据需要的动态性,可以始终以字符串的形式执行,如下所示:

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

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