Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何查询((a1,b1,c1),(a2,b2,c2),…)中的(ColA,ColB,ColC)位置_Ruby On Rails_Ruby_Ruby On Rails 4_Activerecord - Fatal编程技术网

Ruby on rails 如何查询((a1,b1,c1),(a2,b2,c2),…)中的(ColA,ColB,ColC)位置

Ruby on rails 如何查询((a1,b1,c1),(a2,b2,c2),…)中的(ColA,ColB,ColC)位置,ruby-on-rails,ruby,ruby-on-rails-4,activerecord,Ruby On Rails,Ruby,Ruby On Rails 4,Activerecord,如何通过Rails4/ActiveRecord中的多个值集查找多个记录?我想实现以下目标: Foo.where('bar = ? AND baz = ?', 1, 2) 从一些表格中选择*,其中(A,B,C)在((1,2,3),(4,5,6),…)中。 nsave建议的以下方法并不完全有效 User.where({name:[“Alice”,“Bob”],年龄:[20,30,40]}) 将导致 从姓名在('Alice','Bob')、年龄在(20,30,40)的用户中选择* 我需要的正是一段代

如何通过Rails4/ActiveRecord中的多个值集查找多个记录?我想实现以下目标:

Foo.where('bar = ? AND baz = ?', 1, 2)
从一些表格中选择*,其中(A,B,C)在((1,2,3),(4,5,6),…)中。

nsave建议的以下方法并不完全有效

User.where({name:[“Alice”,“Bob”],年龄:[20,30,40]})

将导致

从姓名在('Alice','Bob')、年龄在(20,30,40)的用户中选择*

我需要的正是一段代码,它可以

从(('Alice',20),('Bob',30))(姓名、年龄)中选择*


我想搜索所有恰好包含多组值中的一组的行。我怎样才能做到这一点呢?

您可以执行以下操作:

Foo.where('bar = ? AND baz = ?', 1, 2)
此查询搜索
1的
Foo.bar
2的
Foo.baz


查询可以继续,您可以根据需要传递任意多个条件。您还可以使用其他运算符,如
=
。例如,您可以执行
Foo.where('bar>=?',3)
查询
Foo
类以获得大于或等于3的
bar

如果我理解正确,那么简单地说:

User.where({ name: ["Alice", "Bob"], age: [20,30,40] })

现在回答我自己的问题,因为在使用ActiveRecord 4.2.4时,似乎没有官方的方法来解决这样的问题

我通过使用一种专门用于查询元组的新方法扩展AR解决了我的问题:

module ActiveRecord
  class Base
    class << self

      # not really compatible to the rest of ActiveRecord but it works
      # provide parameters like this: symbols_tuple = [ :col1, :col2, :col3 ]
      # and values_tuples = [ [1, 4, 7], [2, 5, 8], [3, 6, 9]]
      # this will result in a SQL statement like SELECT * FROM table WHERE ((col1, col2, col3) IN ((1,4,7),(2,5,8),(3,6,9)))
      def where_tuple(symbols_tuple, values_tuples)
        tuple_size = symbols_tuple.size

        tuple_part = "(#{(['?']*tuple_size).join(',')})"
        in_stmt = "(#{([tuple_part]*values_tuples.size).join(', ')})"
        stmt = "(#{symbols_tuple.map { |sym| sym.to_s }.join(', ')}) IN #{in_stmt}"

        res = where(stmt, *(values_tuples.flatten!))

        return res
      end

    end # end of class << self
  end # end of class Base
end
模块活动记录
阶级基础

是的,就是这个!在通过ActiveRecord调试了一整天之后,我实际上从来没有想过先尝试一下简单明了的方法。当然,最后就是这么简单!很抱歉问这个问题,我本来可以自己回答的@steschul,好的,不客气,但在提出此类问题之前,请尝试阅读更多文档。如果答案对你有帮助,请接受。对不起,我需要取消此答案的标记。在添加了更多的测试之后,我发现这个解决方案在某些条件下会导致错误的结果。我很快会更新这个问题。Chain multiple
where
callsCheck