使用AssistantTeacher类中的新属性marked_deleted, 我们希望所有查询都能使用only_deleted属性为false的基本假设。
这很容易(使用squeel查询语言而不是标准AR查询语言)
class AssistantTeacher < ActiveRecord.Base
# Gives a default query which always includes the condition here
default_scope {where{marked_deleted == false }}
end
这意味着像 AssistantTeacher.all 这样的查询实际上是
AssistantTeacher.all.where{marked_deleted == false}
效果很好。 同样,AssistantTeacher.find_each()也适用于限制。 同样
AssistantTeacher.where{atcode == "MPL"}
也以
执行I
然而,棘手的部分: 在特殊情况下,我们需要为admins等反转default_scope:
class AssistantTeacher < ActiveRecord.Base
# Gives a default query which always includes the condition here
default_scope {where{marked_deleted == false }}
# If a query is unscoped then the default_scope limitation does not apply
# scoped is the default scope when there is no default_scope
unscoped { scoped}
end
这适用于
def self.all_including_marked_deleted
return unscoped{all}
end
然而:问题 我无法弄清楚如何使用块
对管理版本的find_each进行无范围处理def self.find_each_including_marked_deleted &block
return unscoped{find_each(block)}
end
DOESNOT工作。我也能想到任何其他阻挡组合。
我有什么想法可以做我的覆盖方法find_each_including_marked_deleted将其块传递给未覆盖的调用?
答案 0 :(得分:1)
你只有一个小的语法问题。如果您在&
的前面添加block
,那么您应该没问题:
def self.find_each_including_marked_deleted &block
unscoped { find_each &block }
end
这里发生了什么?在方法体内,block
变量是Proc
的实例(这是&
在block
参数前面所做的事情。您可以通过选中block.class
来验证这一点。 find_each
占用一个块而不是一个proc,所以你需要&
将proc转换回块。
清除泥土?你可以read more about it here。