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
Другие вопросы по тегам