了解Rails在对矛盾关系进行计算时避免查询

69 阅读1分钟

以前,关系计算,如count ,即使传递了一个矛盾,也会进行查询,矛盾关系意味着传递一个空数组,例如:-。

  User.where(id: []).count

对于这样的矛盾关系,调用数据库是没有意义的。

之前

因此,在Rails 7被引入之前,如果用于count,sum,average,minimummaximum 的关系是矛盾的,就会调用数据库。

  => Product.where(title: []).count
  Product Count (4.7ms)  SELECT COUNT(*) FROM "products" WHERE 1=0
  => 0 


  => Product.where(title: []).sum(:price)
  Product Sum (17.5ms)  SELECT SUM("products"."price") FROM "products" WHERE 1=0
  => 0 


  => Product.where(title: []).average(:price)
  Product Average (3.5ms)  SELECT AVG("products"."price") FROM "products" WHERE 1=0
  => nil 


  => Product.where(title: []).minimum(:id)
  Product Minimum (5.0ms)  SELECT MIN("products"."id") FROM "products" WHERE 1=0
  => nil 


  => Product.where(title: []).maximum(:id)
  Product Minimum (5.0ms)  SELECT MAX("products"."id") FROM "products" WHERE 1=0
  => nil 

可以看出,即使在传递矛盾关系时,它也会向数据库进行查询。

之后

现在在Rails 7之后,它避免了对数据库进行查询。

  => Product.where(title: []).count
  => 0 


  => Product.where(title: []).sum(:price)
  => 0 


  => Product.where(title: []).average(:price)
  => nil 


  => Product.where(title: []).minimum(:id)
  => nil 


  => Product.where(title: []).maximum(:id)
  => nil