检查ActiveRecord是否存在多个记录?

时间:2019-11-25 14:33:14

标签: ruby-on-rails ruby-on-rails-5

当至少有一个键存在时,使用#exists?会给出假肯定(即返回true)。

MyModel.exist?(key: [:risk_score, :i_made_this_up]) # => true

我可以进行少量检查:

[:risk_score, :i_made_this_up].all? { |key| MyModel.exists?(key: key) }

但这是一个N + 1查询,如果我有很多要检查的键怎么办?

2 个答案:

答案 0 :(得分:2)

您可以从给定键中减去可能的键,结果应为空数组:

  unknown_keys = keys - MyModel.pluck(:key)
  raise(ArgumentError, "one or more keys do not exist: #{unknown_keys.join(', ')}") unless unknown_keys.empty?

答案 1 :(得分:1)

执行要求的最有效方法是在表上执行COUNT(DISTINCT key),该操作将在ActiveRecord中转换,如下所示:

target_keys = [:risk_score, :i_made_this_up]
MyModel.select(:key).where(key: target_keys).distinct.count == target_keys.length
# In SQL would give  =>
# SELECT COUNT(DISTINCT "my_models"."key") FROM "my_models" WHERE "my_models"."status" IN ($1, $2)  [["key", "risk_score"], ["key", "i_made_this_up"]]

通过这种方式,您仅执行一个应该非常有效的数据库查询,尤其是在key列上有数据库索引的情况下。

相关问题