在 Rails 4.2 项目中,我使用
gem 'permanent_records'
来处理记录软删除,并使用 gem 'globalize'
进行翻译。
Globalize 在翻译模型和翻译模型之间设置以下关系(source):
has_many :translations, :class_name => translation_class.name,
:foreign_key => options[:foreign_key],
:dependent => :destroy,
:extend => HasManyExtensions,
:autosave => true,
:inverse_of => :globalized_model
结果是,在翻译后的模型上调用
:destroy
,不会删除它(这就是 permanent_records 的用途),但我丢失了相关的翻译,我想保留它alive。
我是否应该仅在某些翻译模型(我使用 permanent_records 的翻译模型)上覆盖
dependent: :destroy
回调?怎样做才是正确的呢?
还有其他方法可以得到想要的结果吗?
有很多方法可以处理它。我不建议覆盖依赖::destroy。
最好的方法是使用 paranoia gem 来处理它,它是 actions_as_paranoid 的重新实现。这个 gem 负责使用依赖销毁选项进行软删除。 参考:https://github.com/rubysherpas/paranoia
像这样覆盖回调
def destroy
run_callbacks :destroy do
# your code here for destroy
end
end
我最终通过向
deleted_at
模型添加 GlobalizedModel::Translation
属性(在我的例子中为 Treatment::Translation
)解决了这个问题,这样翻译也被软删除了。
translation_class.class_eval do
def destroy
run_callbacks :destroy
true
end
end
你也试试这个...