gpt4 book ai didi

ruby-on-rails - `before_create` 和 `after_create` 之间有什么区别以及何时使用哪个?

转载 作者:行者123 更新时间:2023-12-04 09:40:23 25 4
gpt4 key购买 nike

我知道 before_create 在对象转换到数据库之前被调用,after_create 在之后被调用。

before_create 将被调用而 after_create 而不是的唯一时间是对象未能满足数据库常量(唯一键等)。除此之外,我可以将 after_create 的所有逻辑放在 before_create 中

我错过了什么吗?

最佳答案

为了理解这两个回调,首先你需要知道这两个回调是什么时候被调用的。下面是 ActiveRecord 回调排序:

(-) 节省

(-) 有效的

(1) before_validation

(-) 证实

(2) after_validation

(3) before_save

(4) before_create

(-) 创建

(5) after_create

(6) after_save

(7) after_commit

你可以看到 before_createafter_validation 之后调用,把它放在简单的上下文中,在您的 ActiveRecord 满足验证后调用此回调。此 before_create通常用于在验证后设置一些额外的属性。

现在转到 after_create ,您可以看到这是在记录持久存储到数据库后创建的。人们通常使用它来做诸如发送通知、记录之类的事情。

对于这个问题,你应该什么时候使用它?答案是“你根本不应该使用它”。 ActiveRecord 回调是反模式的,经验丰富的 Rails 开发人员认为它是代码味道的,您可以通过使用 Service 对象来实现所有这些。这是一个简单的例子:

class Car < ActiveRecord::Base
before_create :set_mileage_to_zero
after_create :send_quality_report_to_qa_team
end

can be rewritten in

# app/services/car_creation.rb

class CarCreation

attr_reader :car

def initialize(params = {})
@car = Car.new(params)
@car.mileage = 0
end

def create_car
if car.save
send_report_to_qa_team
end
end

private

def send_report_to_qa_team
end
end

如果你有简单的应用程序,那么回调是可以的,但是随着你的应用程序的增长,你会摸不着头脑,不确定是什么设置了这个或那个属性,测试将非常困难。

再想一想,我仍然认为您应该广泛使用回调并体验重构它的痛苦,然后您将学会避免它;) 祝你好运

关于ruby-on-rails - `before_create` 和 `after_create` 之间有什么区别以及何时使用哪个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22952664/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com