ActiveRecord where条件中的field字段等于?可能值的数组

110

我想要做

Model.where('id = ?', [array of values])

如何在不使用连续 OR 语句的情况下完成这个查找?

6个回答

209

看起来可以使用 SQL 中的 in 语句来完成,这里有更多信息。

Model.where('id IN (?)', [array of values])

或者更简单地说,正如kdeisz指出的(使用Arel创建SQL查询):

Model.where(id: [array of values])

11
可以将其简化为 Model.where(id: [值的数组]) - kddeisz
Model.where("id in (?)", [1..8]) 对我似乎不起作用。有什么想法吗? - BenKoshy
您不需要使用方括号,1..8 已经类似于数组。 - Will Richardson
1
这个语法会自动转义 [值数组] 中的单引号吗? - WiredIn
1
当我的数组足够大时,该方法会花费很长时间。你如何处理真正大的数组? - jgomo3

22

来自ActiveRecord查询接口指南

如果想使用IN表达式查找记录,可以将一个数组传递给条件哈希:

Client.where(orders_count: [1,3,5])

这个答案中的链接目前无法使用,应该是 https://guides.rubyonrails.org/active_record_querying.html#subset-conditions。 - kangkyu

6
为了易读性,这可以进一步简化为:

为了易读性,这可以更简单地表述为:

Model.find_by(id: [array of values])

这相当于使用where,但更加明确:
Model.where(id: [array of values])

1
find_by actually is where().take. Model.find_by(id: [1, 2, 3]) will only return Model(id: 1) - James.Oliver
如果只想查找符合条件的单个记录,而不是数组,可以使用另一种选项:find_by_id([1, 2, 3]) - Steve

3
你可以使用 'in' 运算符:
Model.in(id: [array of values])

0

wherefind_by之间有一个“小”区别。

find_by如果找到记录,将返回一个记录,否则将返回nil。

查找符合指定条件的第一条记录。没有暗示排序,所以如果顺序很重要,应该自己指定。 如果没有找到记录,则返回nil。

  def find_by(*args)
      where(*args).take
    rescue RangeError
      nil
  end

同时,where 会返回一个关系

返回一个新的关系,该关系是根据参数中的条件过滤当前关系的结果。

因此,在您的情况下,适当的代码是:

Model.where(id: [array of values])

0
如果你正在寻找 Mongoid 中的查询,这就是一个例子:Model.where(:field.in => ["value1", "value2"] ).all.to_a

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接