Rails 3.1 Проверки, определенные в базе данных
Есть ли способ, как выполнить директивы проверки, сохраненные в базе данных?
Видите, у меня нет статически определенных атрибутов по столбцам базы данных, но они определены как тип строки.
нелогич-:
Есть группы и атрибуты. Каждая группа должна иметь разные атрибуты.
Groups: id, name
Attributes: id, name
GroupAttributes: id, group_id, attribute_id, validation(serialize hash as string, same as rails validations)
Articles: id, group_id, attribute_id, value
Форма динамически создается в зависимости от того, какая группа определена. Группа 1 может иметь другую валидацию для атрибута 1, чем группа 1 для того же атрибута.
Но большая проблема - проверки. Я не могу неявно определить это в модели. Потому что я не знаю, какие атрибуты хотят проверить.
У меня есть идея оценить строку, сохраненную в базе данных. Но это важно, когда вводится код (что очень неожиданно).
Знаете ли вы, как решить эту проблему?
РЕДАКТИРОВАТЬ:
Принцип таков: я напишу про CMS, это может быть более понятным.
У CMS есть Статьи / Сообщения, и Сообщение принадлежит Группе (Категория).
Статья должна иметь много атрибутов (сохраненных в таблице базы данных атрибутов), таких как заголовок, содержание, выдержка, миниатюра и т. Д. Но эти атрибуты не закреплены в каждой статье.
Это потому, что статья принадлежит группе. Например: новости, посты, свойства, отзывы и т. Д.
И есть то, что я хочу. Когда я пишу какой-то отзыв, не обязательно ставить все поля (атрибуты) для всех групп, только те, которые нужны.
Так что моя идея заключается в том, что атрибуты проще определить как "тип строки", а не "тип столбца". В любое время я могу добавить новое, удалить старое для любой группы. Там может быть десятки атрибутов (и разных) для любой группы.
После необходимого присоединения ко всем моделям я хочу определить валидацию для каждого атрибута (столбец "валидация" вверху) и использоваться только для тех атрибутов, которые связаны с группой (GroupAttributes). Дайте эти валидации атрибутов в Модель, как стандартные Rails "валидирует". Без сложных условных выражений "если" и "если".
Надежда более детальная, чем первая.
1 ответ
Вы можете попробовать создать собственный валидатор, а затем зациклить атрибуты для группы и оценить их параметры валидации в статье. Но вам понадобится правильный хеш для валидации рельсов.
GroupAttributes.first.validation => {:presence => true,
:length => {:minimum => 3, :maximum => 254},
:uniqueness => true}
#app/models/article.rb
class Article << ActiveRecord::Base
vlidates_with ArticleValidator
end
#lib/article_validator.rb
class ArticleValidator << ActiveModel::Validator
def validate(record)
record.group.group_attributes.each do |group_attribute|
record.validates group_attribute.attribute.name, group_attribute.validation
end
end
end
Я не уверен, если это работает, но надеюсь, что это будет полезно.
ОБНОВЛЕНИЕ: я был неправ, это не работало, потому что validates - это метод ActiveModel, а не ActiveRecord, как я думал. Правильный ответ: вы должны добавить обратный вызов before_validation и затем установить правильные валидаторы.
class Article << ActiveRecord::Base
before_validation :set_validators
validates :group_id, :presence => true
privat
def set_validators
self.group.group_attributes.each do |group_attribute|
Article.validates group_attribute.attribute.name, group_attribute.validation
end
end
end