gpt4 book ai didi

ruby-on-rails - Rails 服务中的 DRY 单例类

转载 作者:行者123 更新时间:2023-12-03 16:35:23 27 4
gpt4 key购买 nike

我正在使用 Elasticsearch 持久性模型,并且对每个索引都有一些通用的方法。

给定一个事件索引,我有一个服务类,其中定义了一些方法,其他 n 个由它们的模型构建的索引也是如此。

class EventSearchService
class << self

def with_index(index_name)
old_repository = repository
@repository = EventSearchService::ElasticsearchEventRepository.new(index_name: index_name)

yield

ensure
@repository = old_repository
end

def index_name
repository.index_name
end

def index_all(event_documents)
return unless event_documents.present?

actions = event_documents.map do |e|
{ index: { _index: index_name, _id: e.id, _type: "_doc", data: e.to_hash }}
end

repository.client.bulk(body: actions)
end


protected

def repository
@repository ||= EventSearchService::ElasticsearchEventRepository.new
end
end
end

我的问题是我最终得到了 n 个具有相同类方法的文件。当我尝试将其直接提取到抽象类时,我收到一个错误,该错误的调查使我发现无法继承单例类。

搜索了一些答案后,我关注了 this线程,我试着把它弄干
require 'forwardable'
require 'singleton'

class ElasticsearchService
include Singleton

class << self
extend Forwardable

def_delegators(
:with_index,
:index_name,
:index_all,
:repository
)
end

def with_index(index_name)
old_repository = repository
@repository = search_repository.new(index_name: index_name)

yield

ensure
@repository = old_repository
end

def index_name
repository.index_name
end

def index_all(documents)
return unless documents.present?

actions = documents.map do |d|
{ index: { _index: index_name, _id: d.id, _type: "_doc", data: e.to_hash }}
end

repository.client.bulk(body: actions)
end

def search_repository
fail "Needs to be overriden"
end

protected

def repository
@repository ||= search_repository.new
end
end

我把它包括为
class EventSearchService < ElasticsearchService
def search_repository
EventSearchService::ElasticsearchEventRepository
end
end

我对代码进行了修改,以使其小巧、简单且与原因相关,但我想展示它的不同方面。如果阅读时间过长,请见谅。

我得到的错误是:
`<class:ElasticsearchService>': undefined local variable or method `​' for ElasticsearchService:Class (NameError)

最佳答案

这个非常狡猾。 您的代码中有一些非 ASCII 空格字符,ruby 解释器将其识别为正在调用的方法的名称。

我把你的代码扔到我的终端里,得到和你完全一样的错误,但是在手工编写并逐个方法执行之后,没有得到它。

在网上找到了一个转换器,在复制/粘贴您的代码(这是 link to the one I used )后,代码运行时没有出现该错误。

因此,正确格式化文件应该可以解决您遇到的特定错误。

关于ruby-on-rails - Rails 服务中的 DRY 单例类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61408324/

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