我可以或者应该使用 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
看来会回滚,根据这个answer和here,两条记录都不会被保存。我确实相信this答案也可能有帮助,但仍然认为我现在需要问这个问题。如果记录更新或创建出现问题,我的示例会回滚吗?
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