Как наиболее эффективно определить, существует ли запись с данным свойством в базе данных Rails? - PullRequest
0 голосов
/ 08 сентября 2018

Я пытаюсь избежать лишних обращений к БД / запросов на моем сайте rails.Учитывая массив URL-адресов, мне нужно знать, был ли соответствующий веб-сайт уже создан в моей базе данных или нет, чтобы я мог создать его при необходимости.

1) Первый метод выбирает все URL-адреса измассив, а затем запрашивает этот меньший набор, чтобы определить, был ли создан данный URL

urls = ["https://www.google.com/", ... "https://stackoverflow.com"]
my_sites = Website.where url: urls
urls.each_with_index do |url, i|
  this_site = my_sites.find_by url: url
  if this_site == nil
    #do stuff
  end
end

2) Второй метод выбирает каждый сайт из записи индивидуально

urls = ["https://www.google.com/", ... "https://stackoverflow.com"]
urls.each_with_index do |url, i|
  this_site = Website.find_by url: url
  if this_site == nil
    #do stuff
  end
end

3) Другой способ?Мне кажется, что ни один из них не слишком эффективен, они оба открывают множество соединений с БД.

Ответы [ 2 ]

0 голосов
/ 09 сентября 2018
urls.each do |url|
   check(url)? false : create_db
end
def create_db
    db create
end
def check ur
    if Website.find_by_url(ur)   
      return true
    else
      return false
end
0 голосов
/ 08 сентября 2018
existing_urls = Website.where(url: urls).pluck(:url)
urls_to_create = urls - existing_urls
urls_to_create.each do |url|
  # create the website, etc
end

Это выполнит один SQL-запрос для извлечения всех существующих URL, используя pluck, чтобы избежать создания экземпляров объектов ActiveRecord.Затем он удаляет этот список из предоставленного списка, а затем устанавливает остальные URL-адреса.

PS Ни один из вариантов, если ваши параметры «откроют много соединений с БД».Однако они будут генерировать много запросов SQL.Что, вероятно, вы имели в виду, но хотели уточнить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...