确定Rails数据库中是否已存在具有给定属性的记录的最有效方法是什么?

时间:2018-09-08 17:47:18

标签: sql ruby-on-rails ruby-on-rails-5

我正在尝试避免在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 :(得分:2)

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。

P.S。您的选项都不会“打开很多数据库连接”。但是,它们将生成大量SQL查询。这可能就是您的意思,但想澄清一下。

答案 1 :(得分:0)

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