Возвращение строк из массива, которые не включены в результат поля записей - PullRequest
0 голосов
/ 25 января 2019

У меня есть таблица Animal с полем specie

Порода может быть ["dog", "cat", "lion", "bird", "elephant", ...]

Мы знаем, что мы также можем найти все записи по:

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

Предположим, у меня есть 10.000 записей и 10.000 различных возможных видов, которые могут быть зарегистрированы. Я просто хочу массив со всеми видами, которые были не включены еще в моей базе данных. Как я могу сделать это наиболее эффективным способом?

Ответы [ 2 ]

0 голосов
/ 25 января 2019

Я тоже согласен с @chaitanya.Хранение 10К строк в ОЗУ неэффективно.Лучше создать таблицу видов и сделать левое соединение с 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)
0 голосов
/ 25 января 2019

Предположим, у вас есть коллекция известных видов где-то в памяти:

species = ["dog", "cat", "lion", "bird", "elephant", ...]
missing_species = species - Animal.distinct.pluck(:specie)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...