Just a quick note — when creating foreign keys in a Rails 5.1+ you should make sure to they are typed as bigint.
But why?
Starting in Rails 5.1 primary keys were defaulted to bigint. Check this commit from 2016. This means that referential foreign keys also need to be bigint. If you’ve gotten into the habit of rails g model Whatever user_id:integer,you need to break it.
Use user:references or user:belongs_to (which is an alias of references) instead. These will automatically use bigint and all will be well.
But why???
If you forget to do this or use some kind of gem that generates an integer foreign key your app won’t break yet…
The issue is rooted in this bit I stole from the PostgreSQL docs:
| Type | Storage Size | Range |
| integer | 4 bytes | -2147483648 to +2147483647 |
| bigint | 8 bytes | -9223372036854775808 to 9223372036854775807 |
bigint is yuge and as a result you could run into a situation where the primary key (a bigint) you’re trying to persist is bigger than the FK column (an integer) can hold.