默认作用域如何工作?
例如,我的模型中有
default_scope -> { includes(:translations) }
这是我的模特
class MyModel
default_scope -> { includes(:translations) }
has_many: translations
end
我知道默认范围可以完成一些默认工作,例如按列排序。
但是它如何与include
一起工作?
答案 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。