2013-05-04 53 views
0

我正在編寫一個Rails應用程序,它需要幾個Ruby類與第三方站點通信,有點像自定義僞API。我無法弄清楚如何最好地將這些代碼放入Rails/MVC範例中。我還想嘗試從我的應用程序的其餘部分中分離出這些代碼,以便在第三方網站更改時儘量減少所需的更改。在Rails應用程序中放置獨立類的公約

我最初的嘗試是把通信代碼在一個名爲Search然後一個方法添加到我的每一個應用程序的數據庫模型(DataModel1DataModel2)的非ActiveRecord的模式來將數據轉換成適當的形式爲第三方網站。我不喜歡這個,因爲如果第三方網站的格式發生變化,我需要更改我的所有模型。

理想情況下,我想有一個Search模型對應於我的每一個數據庫模型的幾個獨立的數據類型的類,並且將數據轉換爲Search模型所需的合適的格式。基本上對應於DataModel1DataType1類和對應於DataModel2DataType2

也許我在想這個,但是我會在哪裏放DataType1DataType2類(理想情況下與Search模型有關)?有沒有更好的方法來組織這些代碼?

回答

0

經過大量的實驗和閱讀的,這裏是我結束了的情況下,任何人有興趣:

我結束了在搜索模型和子模型代表了所有數據的混合方法,以及連接去客戶端在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 

此方法可能不是每一個遵循最佳實踐,並可能是矯枉過正了很多情況,但似乎摸出以及我正試圖解決的問題。如果任何人有更好的想法來重構,我全都耳熟能詳。