【发布时间】:2014-05-26 09:54:20
【问题描述】:
我有一个使用 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 范围内取消这个 default_scope 在 MyOtherModel 范围内的范围?
您的解决方案:
-
has_many :paranoia_models, -> { unscoped }仅返回未删除的内容 -
self.paranoia_models.unscoped返回所有的ParanoiaModel(包括属于其他人的ParanoiaModel)
【问题讨论】:
-
has_many :paranoia_models, -> { unscoped }似乎不起作用,我猜default_scope是之后应用的...... -
unscoped应该可以使用 AFAIK,但为什么不简单地使用self.my_other_models.unscoped? -
@Stefan > 感谢您的回复,我直接回答了我的问题。
标签: ruby ruby-on-rails-4 associations