經過大量的實驗和閱讀的,這裏是我結束了的情況下,任何人有興趣:
我結束了在搜索模型和子模型代表了所有數據的混合方法,以及連接去客戶端在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 。 此外,我創建了搜索子模型來表示搜索在程序中使用的易用性返回的數據,並具有一個抽象層。
型號/搜索/ 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用於創建和顯示搜索的框架。
最後,我創建了一個客戶端類的模塊,以實際聯繫第三方網站並進行搜索。雖然我可能已經能夠將其包含在搜索模型中,但我需要此客戶端持久化(出於多種原因)並處理多個搜索,同時爲每個查詢重新創建搜索模型。
lib/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
此方法可能不是每一個遵循最佳實踐,並可能是矯枉過正了很多情況,但似乎摸出以及我正試圖解決的問題。如果任何人有更好的想法來重構,我全都耳熟能詳。