我试图在我的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)另一种方式?这些似乎都没有效率,他们都打开了很多数据库连接,我相信。
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查询。这可能是你的意思,但想澄清一下。
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