gpt4 book ai didi

ruby 太阳黑子 : how to refactor common code between search do block?

转载 作者:太空宇宙 更新时间:2023-11-03 16:06:25 26 4
gpt4 key购买 nike

如何将 Sunspot search do block 中的通用代码重构为可以从多个地方调用的方法?我怀疑这可能更像是一个 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

我怀疑需要使用 instance_eval,但作为 Ruby 的新手,我不太确定如何应用它。

最佳答案

这是我想出的。

def self.basic_search(params)    
search do
boilerplate(self, params) # here, self is a sunspot search instance

# bespoke basic_search search code goes here
end
end

def self.curated_search(params)
search do
boilerplate(self, params) # here, self is a sunspot search instance

# bespoke curated_search code goes here
end
end

def self.boilerplate(sunspot, params)
sunspot.instance_eval do
facet :category
paginate page: params[:p], per_page: APP_CONFIG[:results_per_page]
end
end

关于 ruby 太阳黑子 : how to refactor common code between search do block?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12804375/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com