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

问题描述 投票:0回答:2

我试图在我的rails网站中避免多余的数据库命中/查询。给定一系列URL,我需要知道是否已在我的数据库中创建了相应的网站,以便我可以根据需要创建它。

1)第一种方法从数组中选择所有url,然后查询这个较小的set以确定是否已创建给定的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)另一种方式?这些似乎都没有效率,他们都打开了很多数据库连接,我相信。

sql ruby-on-rails ruby-on-rails-5
2个回答
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。

附:如果你的选择将“打开很多数据库连接”,也不会。但是,它们会生成大量SQL查询。这可能是你的意思,但想澄清一下。


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
© www.soinside.com 2019 - 2024. All rights reserved.