Продолжение: СУХОЙ между миграцией схемы и методом проверки модели

Мне интересно, если я пропускаю способ избежать повторного кода проверки в моем методе подкласса Sequel::Model#validate, так как я уже поместил все ограничения в свой файл миграции.

Вот простой пример того, о чем я говорю:

  Sequel.migration do
    change do
      create_table :users do
        primary_key :id
        String  :name, :null => false, :unique => true
      end
    end
  end

  class User < Sequel::Model
    def validate
      super
      validates_presence :name
      validates_unique :name
      validates_type String :name
    end
  end

Это кажется очень болезненным, и ошибки склонны повторять все ограничения в методе validate. Я что-то пропустил или другого способа сделать нет?

Любой совет будет оценен, спасибо

2 ответа

Решение

У сиквела есть несколько приятных плагинов и расширений.

Sequel::Model.plugin(:auto_validations)
Sequel::Model.plugin(:constraint_validations)

а также

DB.extension(:constraint_validations)

auto_validations

Плагин auto_validations автоматически устанавливает три типа проверок для столбцов модели:

  • проверки типов для всех столбцов
  • проверки not_null для столбцов NOT NULL (опционально, проверки наличия)
  • уникальные проверки столбцов или наборов столбцов с уникальными индексами

См. http://sequel.jeremyevans.net/rdoc-plugins/classes/Sequel/Plugins/AutoValidations.html

constraint_validations

Расширение constraint_validations предназначено для простого создания ограничений базы данных внутри блоков create_table и alter_table. Он также добавляет соответствующие метаданные об ограничениях в отдельную таблицу, которую плагин модели constraint_validations использует для настройки автоматической проверки.

См. http://sequel.jeremyevans.net/rdoc-plugins/files/lib/sequel/extensions/constraint_validations_rb.html и http://sequel.jeremyevans.net/rdoc-plugins/classes/Sequel/Plugins/ConstraintValidations.html

Ваш пример будет выглядеть так

Sequel::Model.plugin(:auto_validations)
Sequel::Model.plugin(:constraint_validations)

Sequel.migration do
  up do
    extension(:constraint_validations)

    create_table :users do
      primary_key :id
      String :name, :null => false, :unique => true

      validate do
        presence :name,
                 name: :presence_name
      end
    end
  end

  down do
    extension(:constraint_validations)

    drop_table(:users)
  end
end

class User < Sequel::Model
end

Я думаю, это нормально. Не беспокойся

Другие вопросы по тегам