Условная проверка в ActiveRecord - PullRequest
0 голосов
/ 17 апреля 2009

Мне нужно сделать условную проверку моделей в Rails в зависимости от одного из полей в модели. Это продолжение более раннего вопроса , который побудил к разработке решения, которое кажется неправильным.

У меня есть несколько моделей ActiveRecord, основанных на «Модели заказа», сокращенная версия которой показана ниже.

class Order < ActiveRecord::Base

  has_many: previous_addresses
  has_one: applicant
  has_one: current_address
end

Все остальные модели принадлежат к заказу.

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

Я разработал решение для этого, которое включало полный набор проверенных вручную валидаций, поддерживающий все стандартные валидаторы activeRecord. Это решение было разработано с использованием нескольких таблиц, таких как модель, поля, field_items и т. Д., В которых описана проверка и содержится довольно много данных.

Теперь мне нужно манипулировать этими данными, копировать и редактировать их для каждой новой компании, к которой я подключаюсь. Это утомительно и подвержено ошибкам.

Читая «Путь Rails», я обнаружил раздел, в котором Оби Фернандес описал сохранение кода проверки в базе данных в форме операторов проверки ActiveRecord и внедрение их в модели во время выполнения на основе значения идентификатора компании.

Я представляю, как хранить данные в таких таблицах, как: -

company: 200
model: person
Code validates_length_of :middle_name, :maximum => 20, :allow_nil => true

company: 201
model: person
Code validates_length_of :middle_name, :maximum => 1, :allow_nil => true

Так что для компании 201 отчество «Джон» не пройдет проверку, но для компании 200 это будет нормально.

Кто-нибудь видел это, и если да, то есть ли у него какие-либо советы / предложения о том, как это сделать, еще лучше, если у кого-нибудь есть ссылки на учебники / код, который это делает?

1 Ответ

1 голос
/ 17 апреля 2009

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

 validates_each :middle_name do |record, attr, value|
   if record.company == 201
     record.errors.add attr, 'cannot be more than 1 character' if value.length > 1
   elsif record.company == 200
     record.errors.add attr, 'must be less than 20 characters' if value.length > 1
   end
 end
...