为什么更新一个模型会触发rails来加载其他模型?



我的项目有一个奇怪的行为。如果我更新/保存::Product模型上的记录,rails总是加载与它相关的其他模型。

:

p = Product.first
p.update(name: 'whatever')

将输出如下:

(1.2ms)  BEGIN
Product::Brand Load (2.6ms)  SELECT  `product_brands`.* FROM `product_brands` WHERE `product_brands`.`id` = 24 LIMIT 1
Product::Condition Load (5.4ms)  SELECT  `product_conditions`.* FROM `product_conditions` WHERE `product_conditions`.`id` = 3 LIMIT 1
Product::Category Load (1.3ms)  SELECT  `product_categories`.* FROM `product_categories` WHERE `product_categories`.`id` = 2 LIMIT 1
Product Update (4.0ms)  UPDATE `products` SET `updated_at` = '2021-01-28 21:10:16', `name` = 'whatever' WHERE `products`.`id` = 1
(0.5ms)  COMMIT

product属于:brand,:condition:category,但也属于其他模型,但只有这三个模型被触发。

知道为什么会这样吗?

编辑我没有在Product类中设置任何自定义验证。scope和default_scope也没有。

编辑2我刚意识到一件事。这不仅发生在我的Product模型中。但是所有具有belongs_to :something关系的模型将触发相同的查询,除非我添加optional: true。这是Rails的预期行为吗?如果不将optional: true添加到belongs_to关系中,我可以防止这种情况吗?

您可以发布来自Product模型的代码吗?验证,作用域,回调,基本上除了方法之外的所有东西。很可能你有一些东西导致了急切加载。最明显的是:

has_many :brands, :include => true

include :brands

default_scope includes(:brands)

正如Sergio指出的,许多回调和验证可以加载这些相关的模型来执行一些操作。

最新更新