我的用户模型上有一个位置字段,有两个可能的值,西班牙和法国(未来可能更多)。我需要为每个用户进行API调用,但根据用户的位置调用不同的API(同样,以不同方式解析响应)。我不知道解决这个问题的最佳方法是什么。
这或多或少是我现在的代码:
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。谁能指出我正确的方向?在构建这样的抽象层时,最好的做法是什么?
==========编辑==========
我最终将这些类命名为另一个级别并将此方法添加到User类:
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)
在接受用户对象的类中有一个perform方法。根据用户位置值,您可以在内部方法中使用其中一个。