我的项目有一个奇怪的行为。如果我更新/保存::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指出的,许多回调和验证可以加载这些相关的模型来执行一些操作。