我有一个使用Paranioa gem(https://github.com/radar/paranoia)的模型,用于在数据库中保留已删除的ActiveRecord元素。 Paranioa使用deleted_at
列;当此列为NULL
时,不会删除该对象。它使用默认范围,如下所示:
default_scope { where(:deleted_at => nil) }
我的问题是我想在范围内获取所有元素(包括已删除的元素):
class MyOtherModel < ActiveRecord::Base
has_many :paranoia_models
end
此声明生成如下查询:
SELECT * FROM `paranioa_models` WHERE `paranioa_models`.`deleted_at` IS NULL AND ...
使用像这样的函数轻松获取所有元素(包括已删除的元素)
def paranioa_models_with_deleted
return self.paranioa_models.with_deleted
end
with_deleted
unscope默认范围。
我的问题是:如何直接在:has_many
范围内取消MyOtherModel范围内的default_scope?
您的解决方案:
has_many :paranoia_models, -> { unscoped }
仅返回未删除的内容self.paranoia_models.unscoped
返回所有ParanoiaModels(包括属于他人的ParanoiaModel)答案 0 :(得分:1)
你试过这个吗?
def paranoia_models
ParanoiaModel.unscoped { super }
end
答案 1 :(得分:0)
你可以删除或覆盖rails中的default_scope。 例如:
default_scope { where(:deleted_at => nil) }
ParanioaModel.all
ParanioaModel.unscoped.all
unscope将跳过此处的默认范围。