【问题标题】:Is Active-record callbacks - after_save and after_commit are thread-safe?活动记录回调 - after_save 和 after_commit 是线程安全的吗?
【发布时间】:2013-11-21 16:45:24
【问题描述】:

我们有两个模型 - ModelA 和 ModelB。当我们创建/保存 ModelA 的实例时,我们需要为 ModelB 批量插入(需要 ModelA id,ModelA 和 ModelB 之间没有关联)。我们通过在 ModelA 的 after_save 回调中运行后台作业来做到这一点。

问题在于,ModelB 的批量插入不正确,因为 ModelA 没有永久保存在数据库中。所以我们决定使用 after_commit。但是我们还需要 ModelA 的实例状态(在 after_save 中)。我们将此状态分配给 after_save 中的一个变量,并在 after_commit 中访问它。

活动记录 after_Save 和 after_commit 回调在 ModelA 的当前实例上是线程安全的吗?

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案1】:

    我假设您的关联是:

    ModelA has_many :modelBs
    ModelB belongs_to :modelA
    

    您应该在一个事务中完成所有操作,而不是运行 modela 的保存然后运行 ​​modelb 的保存,rails 会为您完成大部分工作。

    @modelA = ModelA.new(params[:modelA])
    
    @modelA.modelBs.new(params[:modelB].values)
    
    @modelA.save
    

    当然,如果您遵循 rails 参数约定

    <form action=(modela_url) post>
    <input name='modelA[`attr`]' ...
    <input name='modelA[`attr`]' ...
    
    <!-- multiple sub model objects
    <input name='modelB[1][`attr`]' ...
    <input name='modelB[2][`attr`]' ...
    

    【讨论】:

    • 感谢您的回答。有一个误解。我已经更新了这个问题。在为 ModelB 插入记录时,我想要 ModelA 实例的 id,并且 ModelA 和 ModelB 之间没有关联。我们正在运行一项用于批量插入的后台服务。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-26
    • 2021-06-19
    • 2021-07-01
    • 1970-01-01
    相关资源
    最近更新 更多