У меня есть поле местоположения на моей модели User с двумя возможными значениями: Испания и Франция (возможно, больше в будущем). Мне нужно сделать 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
Может кто-нибудь комментарий, если это хорошая идея? или если есть лучший способ
Я видел методы 'perform' и' run', но никогда не писал. Что оно делает? Как я буду искать, чтобы узнать больше об этом? – 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