Продолжение: СУХОЙ между миграцией схемы и методом проверки модели
Мне интересно, если я пропускаю способ избежать повторного кода проверки в моем методе подкласса 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