从数组返回未包含在记录字段结果中的字符串

时间:2019-01-25 14:49:20

标签: ruby-on-rails

我有表Animal和字段specie

种类可以是["dog", "cat", "lion", "bird", "elephant", ...]

我们知道我们也可以通过以下方式找到所有记录:

@animals = Animal.all.where(specie: ["dog", "cat", "lion", "bird", "elephant", ...] )

假设我有10.000条记录和10.000种可以注册的不同物种。我只想要一个数组,其中包含数据库中所有未包括的物种。如何以最有效的方式做到这一点?

2 个答案:

答案 0 :(得分:3)

假设您在某个地方的内存中有一个已知物种的集合:

species = ["dog", "cat", "lion", "bird", "elephant", ...]
missing_species = species - Animal.distinct.pluck(:specie)

答案 1 :(得分:1)

我也同意@chaitanya。在RAM中保留10k字符串根本没有效率。最好创建一个种类表并与Animal左连接。那么您可以排除相交的物种。

class Specie
  has_many :animals
  field :name
end

class Animal
  belongs_to :specie
end

Specie.left_joins(:animals).where('animals.id' => nil).distinct.pluck(:name)