如何将 Sunspotsearch do
块中的通用代码重构为可以从多个位置调用的方法?我怀疑这可能更像是一个 Ruby 元编程问题,而不是特定于 Sunspot 的问题,但这里有。
我有一个使用太阳黑子的模型,如下所示:
class Book
def self.basic_search(params)
search do
# boilerplate...
facet :category
paginate page: params[:p], per_page: APP_CONFIG[:results_per_page]
# bespoke basic_search search code goes here
end
end
def self.curated_search(params)
search do
# boilerplate...
facet :category
paginate page: params[:p], per_page: APP_CONFIG[:results_per_page]
# bespoke curated_search code goes here
end
end
end
然后我尝试像这样重构代码:
class Book
def self.basic_search(params)
search do
boilerplate params
# bespoke basic_search search code goes here
end
end
def self.curated_search(params)
search do
boilerplate params
# bespoke curated_search code goes here
end
end
def self.boilerplate(params)
facet :category
paginate page: params[:p], per_page: APP_CONFIG[:results_per_page]
end
end
由于样板方法被定义为 Book 上的类方法,因此不出所料,这会导致:
undefined method 'boilerplate' for #<Sunspot::DSL::Search:0x007f92b4177a98
我怀疑需要一些使用 of instance_eval
,但是对于 Ruby 来说是新手,我不太确定如何应用它。