我正在尝试创建一个将被扩展的超类。超类将调用必须由子类实现的方法。问题是,该方法有时被称为3个块深。在这些块中,我也提到了班级的attributes
。
但是,我得到一个错误,说没有变量或方法,这是因为假设方法和变量来自块类。
这就是它的样子:
class SuperClass
attr_accessor :model
def initialize(model)
@model = model
end
def resources
s = Tire.search(get_index) do
query do
boolean do
must { term :model_id, model.id } #attr_accessor fails
must { all }
search_scope(self) #search_scope fails
end
end
sort do
sort_scope(self) #sort_scope fails
end
end
s.results
end
end
class SubClass < SuperClass
attr_accessor :params
def initialize(model, params)
@params = params
super(model)
end
def search_scope(boolean_query)
boolean_query.must { term field: params[:feild] }
#...
end
def sort_scope(sort_query)
sort_query.by :field, params[:sort_dir]
#...
end
end
search = SubClass.new(model, {})
results = search.resources # undefined method error as explained below
我正在尝试实现的是调用方法search_scope
和sort_scope
(在子类中实现),它还将设置一些搜索和排序参数。但我得到undefined method 'search_scope' for #<Tire::Search::BooleanQuery:0x00000004fc9820>
。正如您所看到的,它正在尝试在块上下文的类上调用search_scope
。与attr_accessor :model
相同。
我知道我可以通过
来解决这个问题def resources
instance = self
# ...
end
然后调用instance.model
和instance.search_scope
,但这意味着我的子类必须在自己的search_scope
和sort_scope
方法中定义实例。
我想知道是否有更好的方法来解决这个问题?