1
0
mirror of https://github.com/jbranchaud/til synced 2026-01-07 00:58:02 +00:00

Add Add A Check Constraint To A Table as a rails til

This commit is contained in:
jbranchaud
2019-11-01 21:02:14 -05:00
parent 8f248ac4d2
commit 1b0a353c4f
2 changed files with 37 additions and 1 deletions

View File

@@ -0,0 +1,35 @@
# Add A Check Constraint To A Table
PostgreSQL allows you to enforce all kinds of rules about the value of a column
or the relationship between two columns. These rules are defined with [_check
constraints_](https://www.postgresql.org/docs/current/ddl-constraints.html#DDL-CONSTRAINTS-CHECK-CONSTRAINTS).
ActiveRecord's migration DSL does not provide a way for adding check
constraints directly. They can be added by executing a SQL statement in a
migration.
```ruby
class EnsurePageCountIsPositive < ActiveRecord::Migration[5.2]
def up
execute <<-SQL
alter table books
add constraint ensure_page_count_is_positive
check (page_count > 0);
SQL
end
def down
execute <<-SQL
alter table books
drop constraint ensure_page_count_is_positive;
SQL
end
```
This check constraint ensures that, anytime you add or update a row in the book
column, the value of `page_count` column is always greater than `0`. This is a
nice thing to enforce because it wouldn't make much sense for a book to have,
say, `-10` pages.
Note: these constraints will not appear in your `db/schema.rb` file. If you
want to see what check constraints have been defined across your tables, you
can crack open `psql` to investigate.