多个块中的上下文丢失

时间:2014-02-13 13:37:19

标签: ruby-on-rails ruby

我正在尝试创建一个将被扩展的超类。超类将调用必须由子类实现的方法。问题是,该方法有时被称为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_scopesort_scope(在子类中实现),它还将设置一些搜索和排序参数。但我得到undefined method 'search_scope' for #<Tire::Search::BooleanQuery:0x00000004fc9820>。正如您所看到的,它正在尝试在块上下文的类上调用search_scope。与attr_accessor :model相同。

我知道我可以通过

来解决这个问题
def resources
  instance = self
  # ...
end

然后调用instance.modelinstance.search_scope,但这意味着我的子类必须在自己的search_scopesort_scope方法中定义实例。

我想知道是否有更好的方法来解决这个问题?

0 个答案:

没有答案