Ruby on Rails覆盖需要块的方法

时间:2013-08-11 22:18:05

标签: ruby-on-rails ruby override codeblocks

使用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将其块传递给未覆盖的调用?

1 个答案:

答案 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