Блог Ruby-разработчика

Rails 5 использование #belongs_to

| Comments

В Rails 5 при указании belongs_to в модели, невозможно будет сохранить запись без наличия ассоциированного объекта. Раньше эта опция также существовала, и теперь она включена по дефолту.

Рассмотрим пример:

1
2
3
4
5
6
7
8
9
10
11
12
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"

В Rails 4.x добиться такого поведения можно, указав дополнительную опцию в вызов метода

1
2
3
4
5
6
7
8
9
10
11
12
class User < ActiveRecord::Base
end

class Post < ActiveRecord::Base
  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"

Вернуть дефолтное поведение в Rails 5 можно, передав опцию optional: true в вызове метода

1
2
3
4
5
6
class Post < ApplicationRecord
  belongs_to :user, optional: true
end

post = Post.create(title: 'Hi')
=> <Post id: 2, title: "Hi", user_id: nil>

Для того чтобы вернуть старое поведение для всего проекта, идем в папку initializers нашего проекта, и видим что в Rails 5 появился новый файл под названием active_record_belongs_to_required_by_default.rb И именно в нем видим настройку, которая отвечает за новое поведение. Мы можем установить ее в false, чтобы отключить его.

1
Rails.application.config.active_record.belongs_to_required_by_default = false

Напомню, что данный файл создается при новой установке Rails 5, в том случае если вы обновляете Rails до версии 5, создайте его вручную.

Comments