删除default_scope关联

时间:2014-05-26 09:54:21

标签: ruby ruby-on-rails-4 associations

我有一个使用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)

2 个答案:

答案 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将跳过此处的默认范围。