我需要一种简单的方法来在更新活动记录时跳过验证和回调。
我正在运行以下代码:
Student.find_or_create_by(id: data['id']).update(data)
其中
data
是具有与 Students 中的列相同的键的哈希。
它按预期工作。但我想在更新时避免所有回调和验证。正如一些堆栈溢出答案中提到的,我尝试过:
Student.find_or_create_by(id: data['id']).send(:update_without_callbacks, data)
它不起作用,未定义的方法说
update_without_callbacks
。
Rails 中有没有像
update_by_skipping_callbacks
或 update(skip_callbacks: true, data)
这样简单直接的方法?
https://guides.rubyonrails.org/active_record_callbacks.html#skipping-callbacks
你可以尝试
update_columns
方法
https://apidock.com/rails/ActiveRecord/Persistence/update_columns
请记住,这会直接进入数据库,因此除非您显式更新,否则
updated_at
列不会更新
尝试
Student.find_or_create_by(id: data['id']).assign_attributes(data).save(validate: false)
至少从 Rails 7.2.2.1 开始,有一个名为 upsert 的 ActiveRecord 方法,它似乎正是您正在寻找的。
从链接中,您可以像这样使用它:
Commodity.upsert(
{ id: 2, name: "Copper", price: 4.84 }
)
并且会直接插入数据库。
还有一个名为upsert_all的多记录方法,对于导入数据集非常有用。