默认范围如何工作?

时间:2018-10-27 17:26:17

标签: ruby-on-rails ruby

默认作用域如何工作?

例如,我的模型中有

  default_scope -> { includes(:translations) }

这是我的模特

class MyModel
 default_scope -> { includes(:translations) }

 has_many: translations
end

我知道默认范围可以完成一些默认工作,例如按列排序。

但是它如何与include一起工作?

1 个答案:

答案 0 :(得分:2)

方法includes旨在解决N + 1个查询问题。例如,如果您有一个模型:

class MyModel < ApplicationRecord
  has_many :translations
end

然后输入此代码

MyModel.limit(50).each do |model|
  model.translations.each do |translation|
    # ...
  end
end

为数据库生成51个查询:一个查询从my_models表中提取50条记录,而50个查询为每个模型提取translations。这会极大地影响应用程序的性能。

要解决此问题,可以将代码重写为:

MyModel.includes(:translations).limit(50).each do |model|
...

使用includes时,Rails仅生成2个SQL查询。第一个获取50条my_models记录,第二个查询获取translations的{​​{1}}。

在上述情况下,my_models仅使您跳过写default_scope -> { includes(:translations) }。即使你写

includes(:translations)

由于翻译是默认范围内的内容,因此Rails会进行2个查询。

我需要补充一点,default_scope有一些明显的陷阱,并且有些开发人员是not recommended