从
fine guide
:
14个作用域
[…]
为了定义一个简单的范围,我们在类内使用scope方法,传递调用这个范围时要运行的查询:
class Article < ApplicationRecord
scope :published, -> { where(published: true) }
end
这与定义类方法完全相同,您使用的是个人偏好问题:
class Article < ApplicationRecord
def self.published
where(published: true)
end
end
所以
scope
主要是创建一个类方法的一种奇特的方法,该方法应该具有特定的行为(即返回一个关系),任何返回一个关系的类方法方法都是一个范围。
范围
以前是很特别的,但现在它们只是类方法,所有类方法都复制到关系以支持链接。
没有办法知道如果方法
Model.m
是一个“实际”范围,它将返回一个关系或某个随机类方法,而不运行它,也不检查它返回的内容或手动检查它的源代码。这个
scopes
你寻找的方法已经不复存在,永远不会回来。
你可以试着黑名单的每一个类方法,你知道是坏的;这种方式谎言和疯狂。
唯一明智的选择是白名单每一个你知道是好的类方法,是你希望用户能够调用的东西。那么你应该过滤
作用域
在控制器和内部排列
AssignableLearningObjectives::Collector
. 我会检查这两个地方,因为根据可用的信息和代码使用的路径,对于允许的内容,您可能有不同的标准;我想稍微少一点干巴巴的,但是效率和健壮性不是朋友。
您可以在
可分配的LearningObjectives::Collector
建设者或
available_objectives
.
如果你想要比以下更漂亮的东西:
scopes.each{ |scope| objectives = objectives.send(scope) }
objectives
然后你可以用
inject
:
def available_objectives
objectives = assignable_objectives....
scopes.inject(objectives) { |objectives, scope| objectives.send(scope) }
end