当至少有一个键存在时,使用#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查询,如果我有很多要检查的键怎么办?
答案 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
列上有数据库索引的情况下。