Рекомендации по валидации "Динамической" модели - PullRequest
6 голосов
/ 13 апреля 2011

У меня есть модель с именем Calendar.

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

Я знаю, что могу использовать пользовательскую проверку + условную проверку, чтобы сделать это, но мне это не кажется чистым.

Интересно, смогу ли я сохранить его в столбце базы данных и передать его "универсальному" методу проверки.

Что ты думаешь?

Объясняя далее:

У пользователя есть календарь.
Другие пользователи, имеющие доступ к этому календарю, могут планировать встречи.

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

Есть много комбинаций, так что я пришел к следующему:

Создайте пользовательские классы валидаторов для каждой из возможных проверок и сделайте затем условными.

class Calendar
  validate_allowed_in_hollydays :appointment_date if :allowedinhollydays?
  (tenths of other cases)
  ...
end

Это работает, но чувствует себя не так.

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

validate_stored_rules :appointment_date

Ответы [ 3 ]

1 голос
/ 13 апреля 2011

Сохранение данных в базе данных и их последующая проверка кажутся немного отсталыми.

Я думаю, что ваша первоначальная мысль о том, чтобы пойти с некоторой пользовательской проверкой, является наилучшим выбором. validates_with выглядит как ваш лучший вариант. Затем вы можете создать отдельный класс и создать всю проверку внутри него, чтобы отделить его от вашей основной модели.

class Person < ActiveRecord::Base
  validates_with GoodnessValidator
end

class GoodnessValidator < ActiveModel::Validator
  def validate
    if record.first_name == "Evil"
      record.errors[:base] << "This person is evil"
    end
  end
end

Код взят из Руководства по проверке рельсов

0 голосов
/ 18 апреля 2011

Спасибо всем за помощь.

У меня это работает так:

def after_initialize        
  singleton = class << self; self; end

  validations = eval(calendar.cofig)

  validations.each do |val|
    singleton.class_eval(val)
  end
end
0 голосов
/ 16 апреля 2011

вы должны использовать with_options , это позволяет добавить параметры по умолчанию в ваш код:

class User < ActiveRecord::Base
  with_options :if => :is_admin do |admin|
    admin.validates_length_of :password, :minimum => 10
  end
end

в примере is_admin может быть столбцом базы данных, attr_accessor или методом

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...