我正在尝试避免在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)另一种方式?这些似乎都不太有效,我相信它们都打开了许多数据库连接。
答案 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