我有一个模型Item
,其属性为attr1
,attr2
和attr3
。
给定Item
个模型的集合(例如来自Item.all
的模型),我将如何检查是否存在带有attr1 == value1
,attr2 == value2
和attr3 == value3
的项目没有而不必遍历所有项目或执行另一个查询?
答案 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?