Active-record回调 - after_save和after_commit是线程安全的吗?

时间:2013-11-21 16:45:24

标签: ruby-on-rails ruby

我们有两个模型 - 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的当前实例上是否是线程安全的?

1 个答案:

答案 0 :(得分:0)

我假设您的协会是:

ModelA has_many :modelBs
ModelB belongs_to :modelA

而不是运行模式的保存,然后运行模型的保存,你应该在一个事务中完成所有操作,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`]' ...