如何从查询中检查ActiveRecord是否存在而不进行迭代?

时间:2019-05-22 19:06:16

标签: ruby-on-rails ruby activerecord

我有一个模型Item,其属性为attr1attr2attr3

给定Item个模型的集合(例如来自Item.all的模型),我将如何检查是否存在带有attr1 == value1attr2 == value2attr3 == value3的项目没有而不必遍历所有项目或执行另一个查询?

3 个答案:

答案 0 :(得分:4)

从算法的角度来看,搜索未排序列表的速度不会比O(n)快。因此,遍历您的收藏集是搜索收藏集的最佳方法。

答案 1 :(得分:2)

如果已经将所有项目分配给变量items,则可以使用find(或detect)在该列表中搜索匹配记录,而无需执行其他查询:

items.find { |item| item.attr1 == value1 && item.attr2 == value2 && item.attr3 == value3 w }

注意:find返回找到的第一条匹配记录,否则返回nil

答案 2 :(得分:1)

您可以使用ActiveRecord::Relation#any?

Item.where(attr1: value1, attr2: value2, attr3: value3).any?

如果您已经具有ActiveRecord关系对象,则仍然可以使用此方法。例如,如果您的控制器中包含以下内容:

def index
  @items = Item.all
end

您可以在自己的视图中或任何地方执行此操作:

@items.where(attr1: value1, attr2: value2, attr3: value3).any?