Как сделать условную проверку в ActiveRecord с n условиями? - PullRequest
0 голосов
/ 25 февраля 2009

Я предоставляю веб-сервис для внешних компаний. Требуемые данные охватывают несколько моделей, включая человека, адрес и т. Д. Я хочу проверить полученные данные условно на основе некоторых полей в запросе. Со временем у меня будет много разных наборов проверочных данных, хотя в настоящее время у меня есть только один, и я собираюсь добавить второй.

Моя текущая модель выглядит примерно так

class Person < ActiveRecord::Base
    validates_length_of :first_name, :within => 1..32, :allow_blank => true
    ...
    ...
end

Концептуально моя модель теперь должна сделать что-то вроде этого.

class Person < ActiveRecord::Base
    validate :first_name?  

    def first_name?
        if country == 'UK'
            if company_name == 'ABC'
                validates_length_of :first_name, :within => 1..32
            else if company_name == 'DEF'
                validates_length_of :first_name, :within => 2..20
            end
        else if country == 'DE'
             if company_name == 'ABC'
                validates_length_of :first_name, :within => 1..32
            else if company_name == 'DEF'
                validates_length_of :first_name, :within => 2..20
            end
    end
end

Очевидно, что это будет хорошо работать для 2 компаний / стран, но не будет работать хорошо, так как количество компаний и / или стран увеличивается. Сейчас я рассматриваю возможность сохранения данных проверки в базе данных или в файле YAML, а затем выполняю проверки вручную для каждого поля на основе минимальных, максимальных значений формата, хранимых извне из модели.

Я думаю, что мог бы сохранить данные проверки в структуре, подобной следующей

country: UK
    companyname: ABC  
        field: first_name  
            minimum_length: 2  
            maximum_length: 20  
            required: true  
        field: middle_name  
            minimum_length: 1  
            maximum_length: 10  
        field: email_address  
            minimum_length: 10  
            format: /someregexforemail addresses/

    companyname: DEF
        field
           ...
country: DE
    companyname: XYZ
       field: 
         ....  

и так далее.

Затем я мог бы загрузить эти данные проверки и использовать их в моем собственном свернутом валидаторе.

Кто-нибудь делал подобные вещи в прошлом и какими методами вы пользовались? Мне особенно интересно узнать, как вы подошли к следующему.

  • Где вы хранили свои данные конфигурации, то есть DB или YAML?
  • Вы загружали и анализировали данные конфигурации для каждого запроса или один раз при загрузке сервера?
  • Как вы структурировали реальный метод, который проводил валидацию?

1 Ответ

1 голос
/ 25 февраля 2009

Я сделал что-то похожее с номерами телефонов. Ваш подход очень похож на то, что я сделал сам. Чтобы ответить на ваши вопросы:

  1. Я сохранил конфигурацию проверки в файле YAML. Однако, если ваши данные будут расти в значительной степени, вам следует рассмотреть возможность использования базы данных.
  2. Я загружаю и анализирую данные по каждому запросу. Я не думаю, что это лучший подход, и планирую переписать эту часть.
  3. Я написал свое подтверждение. Вы можете узнать, как это сделать здесь .

Это тебе помогло?

...