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
任何人可以評論,如果這是個好主意嗎?或者如果有更好的方法
我見過「執行」和「運行」方法,但從未寫過。它有什麼作用?我將如何搜索更多關於它的內容? – joshblour
它不一定是一個PERFORM方法。你可以使用這個GIST中的東西(https://gist.github.com/satyatechsavy/7639411)。我假設medications_by_name方法將國家名稱作爲參數 –
哦,我明白了。該位置存儲在用戶記錄中。在這個API類中,我省略了大約10-15個以上的方法。我希望能夠做這樣的'Api :: Foobar.new(User.first).contraindications',然後根據用戶的國家,它會調用'禁忌症'方法(或任何其他方法)來自'Api :: Foobar :: Spain'或'Api :: Foobar :: France'類。 – joshblour