2013-11-25 64 views
0

我在用戶模型上有一個位置字段,有兩個可能的值,西班牙和法國(可能在將來會更多)。我需要爲每個用戶進行API調用,但根據用戶的位置調用不同的API(也分析不同的響應)。我不知道解決這個問題的最好方法是什麼。rails:針對不同用戶的不同方法

這裏或多或少我的代碼看起來像現在:

class Api::Foobar 
    include HTTParty 
    base_uri 'http://demo.foobar.es/vweb/xml' 

    GLOBAL_OPTIONS = {edad: 'anciano', farmacovigilancia: false, deportista: false, administrativas: false} 

    def initialize(user) 
    @user = user 
    end 

    def contraindications 
    self.class.get("/ws_patient/alertas", query: GLOBAL_OPTIONS.merge(user_options)) 
    end 

    def self.medications_by_name(name) 
    response = get("/ws_drug/SearchByName", query: {value: name}) 
    response['object']['drug_set']['drug'] 
    end 

    ..... 

end 

我做這樣的事情Api::Foobar.medications_by_name('asp')Api::Foobar.new(User.first).contraindications

我想建立一個抽象層,允許我打電話給每個用戶使用相同的方法,並根據用戶的位置自動選擇適當的類/模塊/ api。任何人都可以將我指向正確的方向嗎?在構建像這樣的抽象層時,可能有關於最佳實踐的東西?

========== ==========編輯

我最終命名空間中的類一個多層次,增加此方法將用戶等級:

def foobar_api 
    if !self.location.nil? 
     Object.qualified_const_get("Api::Foobar::#{self.location.capitalize}").new(self) 
    else 
     Api::Foobar::Spain.new(self) 
    end 
    end 

現在我打電話User.first.foobar_api.contraindications

任何人可以評論,如果這是個好主意嗎?或者如果有更好的方法

回答

0

在接受用戶對象的類中有一個執行方法。根據用戶位置值,您可以使用內部方法中的一種。

+0

我見過「執行」和「運行」方法,但從未寫過。它有什麼作用?我將如何搜索更多關於它的內容? – joshblour

+0

它不一定是一個PERFORM方法。你可以使用這個GIST中的東西(https://gist.github.com/satyatechsavy/7639411)。我假設medications_by_name方法將國家名稱作爲參數 –

+0

哦,我明白了。該位置存儲在用戶記錄中。在這個API類中,我省略了大約10-15個以上的方法。我希望能夠做這樣的'Api :: Foobar.new(User.first).contraindications',然後根據用戶的國家,它會調用'禁忌症'方法(或任何其他方法)來自'Api :: Foobar :: Spain'或'Api :: Foobar :: France'類。 – joshblour