2013-11-25 2 views
0

У меня есть поле местоположения на моей модели 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

Может кто-нибудь комментарий, если это хорошая идея? или если есть лучший способ

ответ

0

В классе, который принимает объект пользователя, должен быть метод выполнения. И исходя из значения местоположения пользователя, вы можете использовать один из внутренних методов.

+0

Я видел методы 'perform' и' run', но никогда не писал. Что оно делает? Как я буду искать, чтобы узнать больше об этом? – 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