module Sequel::Plugins::AutoValidations

  1. lib/sequel/plugins/auto_validations.rb

The auto_validations plugin automatically sets up the following types of validations for your model columns:

  1. type validations for all columns

  2. not_null validations on NOT NULL columns (optionally, presence validations)

  3. unique validations on columns or sets of columns with unique indexes

  4. max length validations on string columns

To determine the columns to use for the type/not_null/max_length validations, the plugin looks at the database schema for the model's table. To determine the unique validations, Sequel looks at the indexes on the table. In order for this plugin to be fully functional, the underlying database adapter needs to support both schema and index parsing.

This plugin uses the validation_helpers plugin underneath to implement the validations. It does not allow for any per-column validation message customization, but you can alter the messages for the given type of validation on a per-model basis (see the validation_helpers documentation).

You can skip certain types of validations from being automatically added via:

Model.skip_auto_validations(:not_null)

If you want to skip all auto validations (only useful if loading the plugin in a superclass):

Model.skip_auto_validations(:all)

It is possible to skip auto validations on a per-model-instance basis via:

instance.skip_auto_validations(:unique, :not_null) do
  puts instance.valid?
end

By default, the plugin uses a not_null validation for NOT NULL columns, but that can be changed to a presence validation using an option:

Model.plugin :auto_validations, not_null: :presence

This is useful if you want to enforce that NOT NULL string columns do not allow empty values.

You can also supply hashes to pass options through to the underlying validators:

Model.plugin :auto_validations, unique_opts: {only_if_modified: true}

This works for unique_opts, max_length_opts, schema_types_opts, explicit_not_null_opts, and not_null_opts.

Usage:

# Make all model subclass use auto validations (called before loading subclasses)
Sequel::Model.plugin :auto_validations

# Make the Album class use auto validations
Album.plugin :auto_validations

Methods

Public Class

  1. apply
  2. configure

Constants

EMPTY_ARRAY = [].freeze  
EXPLICIT_NOT_NULL_OPTIONS = {:from=>:values, :allow_missing=>true}.freeze  
MAX_LENGTH_OPTIONS = {:from=>:values, :allow_nil=>true}.freeze  
NOT_NULL_OPTIONS = {:from=>:values}.freeze  
SCHEMA_TYPES_OPTIONS = NOT_NULL_OPTIONS  
UNIQUE_OPTIONS = NOT_NULL_OPTIONS  

Public Class methods

apply (model, opts=OPTS)
[show source]
   # File lib/sequel/plugins/auto_validations.rb
69 def self.apply(model, opts=OPTS)
70   model.instance_exec do
71     plugin :validation_helpers
72     @auto_validate_presence = false
73     @auto_validate_not_null_columns = []
74     @auto_validate_explicit_not_null_columns = []
75     @auto_validate_max_length_columns = []
76     @auto_validate_unique_columns = []
77     @auto_validate_types = true
78 
79     @auto_validate_options = {
80         :not_null=>NOT_NULL_OPTIONS,
81         :explicit_not_null=>EXPLICIT_NOT_NULL_OPTIONS,
82         :max_length=>MAX_LENGTH_OPTIONS,
83         :schema_types=>SCHEMA_TYPES_OPTIONS,
84         :unique=>UNIQUE_OPTIONS
85     }.freeze
86   end
87 end
configure (model, opts=OPTS)

Setup auto validations for the model if it has a dataset.

[show source]
    # File lib/sequel/plugins/auto_validations.rb
 90 def self.configure(model, opts=OPTS)
 91   model.instance_exec do
 92     setup_auto_validations if @dataset
 93     if opts[:not_null] == :presence
 94       @auto_validate_presence = true
 95     end
 96 
 97     h = @auto_validate_options.dup
 98     [:not_null, :explicit_not_null, :max_length, :schema_types, :unique].each do |type|
 99       if type_opts = opts[:"#{type}_opts"]
100         h[type] = h[type].merge(type_opts).freeze
101       end
102     end
103     @auto_validate_options = h.freeze
104   end
105 end