在ActiveAdmin中,可以使用before_save回调和ActiveRecord::Transactions模块来解决此问题。下面是示例代码:
ActiveAdmin.register Parent do
has_many :children
before_save do |parent|
parent.children.each do |child|
child.with_lock do
child.save(validate: false)
end
end
end
end
此代码将在保存父对象之前,使用with_lock锁定每个子对象并将其保存到数据库中,即使父对象的保存失败,它们也将不会被改变。同时,可以保证单独保存子对象时不会导致性能问题。
但是需要注意的是,此解决方法可能会影响性能,尤其是当关联对象非常多时。因此,需要考虑具体情况并适当地权衡性能和数据一致性。