代码之家  ›  专栏  ›  技术社区  ›  James L.

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

  •  0
  • James L.  · 技术社区  · 6 年前

    我试图避免在我的rails站点中出现过多的DB点击/查询。给定一个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 回复  |  直到 6 年前
        1
  •  2
  •   Philip Hallstrom    6 年前
    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,使用cluck来避免实例化ActiveRecord对象。然后从提供的列表中删除该列表,然后设置剩余的url。

        2
  •  0
  •   Arun P    6 年前
    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