Data Validations
ORM::ActiveRecord supports many forms of data validations, when they occur and if they occur at all.
Acceptance
The acceptance
validation requires a field value to be True
for the Model
instance to be valid.
| use ORM::ActiveRecord::Model;
class Contract is Model {
submethod BUILD {
self.validate: 'terms', { :acceptance }
}
}
|
A value of False
will make the instance invalid and the validated field will contain an error.
| my $contract = Contract.create({name => 'Offical Document', terms => False});
say $contract.is-valid;
say $contract.errors.terms[0];
|
Output
Confirmation
The confirmation
validation requires a field to be "confirmed" for the Model
instance to be valid. A virtual field with a suffix of "_confirmed" is required. Combining confirmation
with presence
is usually helpful.
1
2
3
4
5
6
7
8
9
10
11
12
13
14 | use ORM::ActiveRecord::Model;
class Client is Model {
submethod BUILD {
self.validate: 'email', { :presence, :confirmation }
}
}
my $client = Client.build({email => 'fred@aol.com'});
say $client.is-invalid;
say $client.errors.email[0];
$client = Client.build({email => 'fred@aol.com', email_confirmation => 'fred@aol.com'});
say $client.is-valid;
|
Output
| False
must be confirmed
True
|
Exclusion
The exclusion
validation prevents certain values from being entered. The excluded values are defined using in
.
| use ORM::ActiveRecord::Model;
class Person is Model {
submethod BUILD {
self.validate: 'username', { exclusion => { in => <admin superuser> } }
}
}
my $person = Person.build({username => 'admin'});
say $person.is-valid;
say $person.errors.username[0];
|
Output
The format
validation requires a field value match a specific regular expression. The format is defined using with
.
| use ORM::ActiveRecord::Model;
class Contact is Model {
submethod BUILD {
self.validate: 'email', { format => { with => /:i ^<[\w]>+ '@' <[\w]>+ '.' <[\w]>+$/ } }
}
}
my $contact = Contact.create({email => 'foo'});
say $contact.is-valid;
say $contact.errors.email[0];
|
Output
Inclusion
The inclusion
validation requires a field value exist in a list of pre-defined values. The allowed values are defined using in
.
| use ORM::ActiveRecord::Model;
class Image is Model {
submethod BUILD {
self.validate: 'format', { inclusion => { in => <gif jpeg jpg png> } }
}
}
my $image = Image.build({format => 'foo'});
say $image.is-invalid;
say $image.errors.format[0];
|
Output
Length
The length
validation requires a field value to be a certain length to be valid.
Valid values are defined using min
, max
, is
, or in
.
Minimum
A min
length validation requires the length of the field value be a specified minimum:
| use ORM::ActiveRecord::Model;
class User is Model {
submethod BUILD {
self.validate: 'fname', { length => { min => 4 } }
}
}
my $user = User.build({fname => 'Joe'});
say $user.is-valid;
say $user.errors.fname[0];
|
Output
| False
at least 4 characters required
|
Maximum
A max
length validation requires a field value length be less than a specified value.
| use ORM::ActiveRecord::Model;
class User is Model {
submethod BUILD {
self.validate: 'fname', { length => { max => 12 } }
}
}
my $user = User.build({fname => 'Michaelangelo'});
say $user.is-valid;
say $user.errors.fname[0];
|
Output
| False
only 12 characters allowed
|
In a range
An in
length validation requires the field value length be within a specified range.
| use ORM::ActiveRecord::Model;
class User is Model {
submethod BUILD {
self.validate: 'fname', { length => { in => 4..32 } }
}
}
my $user = User.build({fname => 'Joe'});
say $user.is-valid;
say $user.errors.fname[0];
|
Output
| False
4 to 32 characters required
|
Is exactly
An is
length validation requires a value be an exact size:
| use ORM::ActiveRecord::Model;
class User is Model {
submethod BUILD {
self.validate: 'fname', { length => { is => 8 } }
}
}
my $user = User.build({fname => 'Joe'});
say $user.is-valid;
say $user.errors.fname[0];
|
Output
| False
exactly 8 characters required
|
Numericality
The numericality
validation requires a field value to be numerical and of a specific value or in a specific range. Values can be specified using gt
, gte
, lt
, lte
, as well as in
for ranges.
Less than
| use ORM::ActiveRecord::Model;
class Book is Model {
submethod BUILD {
self.validate: 'pages', { numericality => { lt => 400 } }
}
}
my $book = Book.create({pages => 400});
say $book.is-valid;
say $book.errors.pages[0];
|
Output
| False
less than 400 required
|
Less than or equal
| use ORM::ActiveRecord::Model;
class Book is Model {
submethod BUILD {
self.validate: 'pages', { numericality => { lte => 400 } }
}
}
my $book = Book.create({pages => 401});
say $book.is-valid;
say $book.errors.pages[0];
|
Output
| False
400 or less required
|
Greater than
| use ORM::ActiveRecord::Model;
class Book is Model {
submethod BUILD {
self.validate: 'pages', { numericality => { gt => 400 } }
}
}
my $book = Book.create({pages => 400});
say $book.is-valid;
say $book.errors.pages[0];
|
Output
| False
more than 400 required
|
Greater than or equal
| use ORM::ActiveRecord::Model;
class Book is Model {
submethod BUILD {
self.validate: 'pages', { numericality => { gte => 400 } }
}
}
my $book = Book.create({pages => 399});
say $book.is-valid;
say $book.errors.pages[0];
|
Output
| False
400 or more required
|
In a range
| use ORM::ActiveRecord::Model;
class Book is Model {
submethod BUILD {
self.validate: 'pages', { numericality => { in => 400..1000 } }
}
}
my $book = Book.create({pages => 399});
say $book.is-valid;
say $book.errors.pages[0];
|
Output
| False
400 to 1000 required
|
Presence
The presence
validation requires a field value to simply exist for the Model
instance to be valid.
| use ORM::ActiveRecord::Model;
class User is Model {
submethod BUILD {
self.validate: 'fname', { :presence }
}
}
my $user = User.build;
say $user.is-valid;
say $user.errors.fname[0];
|
Output
Uniqueness
The uniqueness
validation requires a field value to be unique with respect to existing field value data in the database.
1
2
3
4
5
6
7
8
9
10
11
12
13
14 | use ORM::ActiveRecord::Model;
class Person is Model {
submethod BUILD {
self.validate: 'username', { :uniqueness }
}
}
my $person = Person.create({username => 'alfred'});
say $person.is-valid;
my $person_2 = Person.build({username => 'alfred'});
say $person_2.is-valid;
say $person_2.errors.username[0];
|
Output
| True
False
must be unique
|
Unique Scope
The uniqueness
validation can also contain a scope. This, for example, can be used for validating uniqueness within a specific foreign key.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 | use ORM::ActiveRecord::Model;
class Subscription {...}
class User is Model {
submethod BUILD {
self.has-many: subscriptions => class => Subscription;
self.validate: 'fname', { :presence }
}
}
class Magazine is Model {
submethod BUILD {
self.has-many: subscriptions => class => Subscription;
self.validate: 'title', { :presence }
}
}
class Subscription is Model {
submethod BUILD {
self.belongs-to: user => class => User;
self.belongs-to: magazine => class => Magazine;
self.validate: 'user_id', { uniqueness => scope => :magazine_id }
}
}
my $user = User.create({fname => 'Greg'});
my $magazine = Magazine.create({title => 'Mad'});
my $subscription = Subscription.create({:$user, :$magazine});
say $subscription.is-valid;
my $subscription_2 = Subscription.build({:$user, :$magazine});
say $subscription_2.is-valid;
say $subscription_2.errors.user_id[0];
|
Output
| True
False
must be unique
|