多くのサービス オブジェクトを持つアプリケーションに取り組んでいます。通常、これらのサービスの仕事は、1 つ以上の Active Record モデルを構築することです。サービスがアプリケーションに結び付けられるのを避けるために、ユーザーがモデルの名前を変更できるようにしています。次に例を示します。
class MyServiceObject
attr_reader :options
def initialize(options = {})
@options = options
@options[:foo_klass] ||= Foo
end
def do_something
options[:foo_klass].new
end
end
かなりうまく機能すると思いましたが、このソリューションには柔軟性が欠けている場合があることがわかりました。たとえば、属性の 1 つを使用してモデルを検索する必要があるサービスがあります。それが私がそれを実装したかった方法です:
class MyServiceObject
attr_reader :options
def initialize(options = {})
@options = options
@options[:lookup_proc] ||= Proc.new do |attribtue|
DefaultModel.find_by_attribute(attribtue)
end
end
def do_something(attribtue)
options[:lookup_proc].call(attribtue)
end
end
それが最も適切な解決策であるかどうかはわかりません。一部の記事では、一種の「アダプター」である別のサービス オブジェクトを使用していますが、このような単純なユース ケースではやり過ぎのようです。
何か提案はありますか?現在のアプローチを続けますか?