如何在 Rails 中创建/更新 ActiveRecord 时跳过所有回调

问题描述 投票:0回答:3

我需要一种简单的方法来在更新活动记录时跳过验证和回调。

我正在运行以下代码:

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)
这样简单直接的方法?

ruby-on-rails ruby validation activerecord callback
3个回答
4
投票

https://guides.rubyonrails.org/active_record_callbacks.html#skipping-callbacks

你可以尝试

update_columns
方法

https://apidock.com/rails/ActiveRecord/Persistence/update_columns

请记住,这会直接进入数据库,因此除非您显式更新,否则

updated_at
列不会更新


0
投票

尝试

Student.find_or_create_by(id: data['id']).assign_attributes(data).save(validate: false)

0
投票

至少从 Rails 7.2.2.1 开始,有一个名为 upsertActiveRecord 方法,它似乎正是您正在寻找的。

从链接中,您可以像这样使用它:

Commodity.upsert(
    { id: 2, name: "Copper", price: 4.84 }
)

并且会直接插入数据库。

还有一个名为upsert_all的多记录方法,对于导入数据集非常有用。

© www.soinside.com 2019 - 2024. All rights reserved.