Rails 回调,在创建或更新关联记录后创建记录

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

我可以或者应该使用 callback 在 Rails 中创建关联记录吗?另外,如果记录创建或更新失败,这两条记录是否都不会保存在数据库中?

此解决方案背后的想法是干燥代码。

如果是这样,我应该使用

after_save
还是其他东西?如果我应该使用
after_save
,下面的示例是否足够,或者我是否需要提出错误或执行其他操作?

我知道像 papertrail 这样的宝石可以做类似的事情,但这不是我们需要的解决方案。

示例:

class Fruit < ApplicationRecord

end


class Apple < ApplicationRecord
  after_save :create_fruit
 
  def create_fruit
     Fruit.create!(item_id: self.id)
  end
end

看来会回滚,根据这个answerhere,两条记录都不会被保存。我确实相信this答案也可能有帮助,但仍然认为我现在需要问这个问题。如果记录更新或创建出现问题,我的示例会回滚吗?

ruby-on-rails callback
1个回答
0
投票

Rails 中的每个回调都包装在事务中,所以你是对的:如果出现问题,回调中所做的所有更改都将回滚。

关于代码的快速说明:创建新记录和更新现有记录后都会触发

after_save
回调。我假设你不想每次更新苹果时都创建一个新的水果。在这种情况下,您应该使用
after_create
回调,该回调仅在创建新记录时运行。

此外,您可以利用 Rails 关联。此功能提供了许多有用的方法,例如

create_<your association name>
(在您的情况下为
create_fruit
),这使得管理关联记录变得更加容易。

这是我建议的解决方案:

class Fruit < ApplicationRecord; end

class Apple < ApplicationRecord
  has_one :fruit, foreign_key: :item_id, class_name: 'Fruit'
  after_create :create_fruit, if: -> { fruit.blank? }
end
© www.soinside.com 2019 - 2024. All rights reserved.