用ActiveRecord检查是否存在多条记录?

Kri*_*ris 5 ruby-on-rails ruby-on-rails-5

当至少有一个键存在时,使用#exists?会产生误报(即返回 true)。

MyModel.exist?(key: [:risk_score, :i_made_this_up]) # => true
Run Code Online (Sandbox Code Playgroud)

对于少量检查,我可以这样做:

[:risk_score, :i_made_this_up].all? { |key| MyModel.exists?(key: key) }
Run Code Online (Sandbox Code Playgroud)

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

Kri*_*ris 2

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

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