经过大量的实验和阅读,如果有人感兴趣,我最终得出的结论是:
我最终采用了一种混合方法,所有数据都表示在搜索模型和子模型中,第三方站点的连接客户端位于 lib 文件夹中的模块中。
模型/search.rb:
class Search
def initialize( params )
# code to start a new Search on third party site
@result = SearchApi.example_query( data_type_1_param )
# more code...
end
# other code to assist in parsing of search results
end
模型/搜索/data_type_1.rb:
class Search::DataType1 < Hash
def initialize( DataModel1 )
# code to convert DataModel1 to DataType1 for sending request
end
end
我还有其他几个看起来类似于 DataType1 的搜索子模型。此外,我创建了 Search 子模型来表示 Search 返回的数据,以便在程序中易于使用并具有抽象层。
模型/搜索/results.rb:
class Search::Results
def initialize(result_hash)
@data = result_hash
end
def field_1
# code to parse and display field 1 from @data hash
end
def field_2
# code to parse and display field 2 from @data hash
end
#.... etc
end
搜索模型本身可能不是完全必要的(大部分代码都在模块和子模型中),但它很方便地适合用于创建和显示搜索的 MVC 框架。
最后,我创建了一个带有客户端类的模块来实际联系第三方站点并进行搜索。虽然我可能已经能够将它包含在 Search 模型中,但我需要这个客户端保持(出于多种原因)并处理多个搜索,同时为每个查询重新创建 Search 模型。
库/search_api.rb:
require 'search_api/client'
module SearchApi
class << self
def client
@client ||= SearchApi::Client.new()
@client
end
def example_query( data )
results = client.query( formatted_data )
# among other code
end
# other code to perform validations and interact with client
end
end
lib/search_api/client.rb:
module SearchApi
class Client
include HTTParty
# code to create and handle connection to Search site
end
end
这种方法可能不会遵循所有最佳实践,并且在很多情况下可能过于矫枉过正,但对于我试图解决的问题似乎效果很好。如果有人有更好的重构想法,我会全力以赴。