February 15, 2016
This blog is part of our Rails 5 series.
In Rails 5, whenever we define a belongs_to association, it is required to
have the associated record present by default after
this change.
It triggers validation error if associated record is not present.
class User < ApplicationRecord
end
class Post < ApplicationRecord
belongs_to :user
end
post = Post.create(title: 'Hi')
=> <Post id: nil, title: "Hi", user_id: nil, created_at: nil, updated_at: nil>
post.errors.full_messages.to_sentence
=> "User must exist"
As we can see, we can't create any post record without having an associated
user record.
In Rails 4.x world To add validation on belongs_to association, we need to add
option required: true .
class User < ApplicationRecord
end
class Post < ApplicationRecord
belongs_to :user, required: true
end
post = Post.create(title: 'Hi')
=> <Post id: nil, title: "Hi", user_id: nil, created_at: nil, updated_at: nil>
post.errors.full_messages.to_sentence
=> "User must exist"
By default, required option is set to false.
We can pass optional: true to the belongs_to association which would remove
this validation check.
class Post < ApplicationRecord
belongs_to :user, optional: true
end
post = Post.create(title: 'Hi')
=> <Post id: 2, title: "Hi", user_id: nil>
But, what if we do not need this behavior anywhere in our entire application and not just a single model?
New Rails 5 application comes with an initializer named
new_framework_defaults.rb.
When upgrading from older version of Rails to Rails 5, we can add this
initializer by running bin/rails app:update task.
This initializer has config named
Rails.application.config.active_record.belongs_to_required_by_default = true
For new Rails 5 application the value is set to true but for old applications,
this is set to false by default.
We can turn off this behavior by keeping the value to false.
Rails.application.config.active_record.belongs_to_required_by_default = false
class Post < ApplicationRecord
belongs_to :user
end
post = Post.create(title: 'Hi')
=> <Post id: 3, title: "Hi", user_id: nil, created_at: "2016-02-11 12:36:05", updated_at: "2016-02-11 12:36:05">
If this blog was helpful, check out our full blog archive.