Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails查询优化_Ruby On Rails_Ruby On Rails 2 - Fatal编程技术网

Ruby on rails Rails查询优化

Ruby on rails Rails查询优化,ruby-on-rails,ruby-on-rails-2,Ruby On Rails,Ruby On Rails 2,我有两个情态动词,它们相互关联。我需要优化我的代码,以便在加载modal1时加载modal2 现在我的问题是,我的modal2代码中有一个命名的_范围,它对基于modal2列的结果提出了一些条件。当我调用此命名范围时,应用程序再次命中数据库,这降低了我的应用程序性能 代码格式 模态1 Class Modal1 < ActiveRecord::Base ... has_association :modal2 # some association which we can access

我有两个情态动词,它们相互关联。我需要优化我的代码,以便在加载modal1时加载modal2

现在我的问题是,我的modal2代码中有一个命名的_范围,它对基于modal2列的结果提出了一些条件。当我调用此命名范围时,应用程序再次命中数据库,这降低了我的应用程序性能

代码格式 模态1

Class Modal1 < ActiveRecord::Base
...
    has_association :modal2 # some association which we can access through . operator
    named_scope :egr_load ,:include => [:modal2]
...
end
有谁能告诉我,当急切地加载对象的命名作用域(在其自己的列上有条件)被调用时,如何避免这个DB再次命中


提前感谢

我投票决定作为的副本关闭,但如果删除的记录数量不太多,您可以:

Modal1.egr_load.each do |ref2|
  unless ref2.modal2.deleted_at.nil?
    ...
  end
end

我认为这里的急切加载不会有任何效果,因为您正在对已经急切加载的对象运行第二个查询,这将需要Rails再次查询数据库

解决方案是将所有这些条件附加到每个块之前的主查询中,例如:

Modal1.egr_load.custom_condition_on_modal2.each do |ref2|
    ref2 # will already be chosen between the not deleted objects
end

我不认为查询是关于对数据库的最佳查询命中率。我想要一个非常少的DB点击数的解决方案,请您检查一下。但是答案对我来说是有用的。是的,我使用了相同的,但有if条件,无论如何,如果有更多的解决方案就好了。。
Modal1.egr_load.each do |ref2|
  unless ref2.modal2.deleted_at.nil?
    ...
  end
end
Modal1.egr_load.custom_condition_on_modal2.each do |ref2|
    ref2 # will already be chosen between the not deleted objects
end