Trong Rails 5. Bất cứ khi nào chúng ta định nghĩa một quan hệ belongs_to. Thì nó bắt buộc chúng ta cung cấp một đối tượng quan hệ với nó.
Rails sẽ tiến hành validation lỗi nếu đối tượng quan hệ không tồn tại
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"
Như chúng ta có thể thấy, chúng ta không thể tạo bất kỳ một post nào nếu không có một quan hệ user nào
Làm thế nào để giải quyết được điều này trong Rails 5
Trong Rails 4.x để thêm validation cho belongs_to chúng ta chỉ cần thêm tùy chọn 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"
Mặc định trong Rails 4.x tùy chọn required là false.
Để bỏ qua validation belongs_to trong Rails 5. Chúng ta chỉ cần thêm tùy chọn optional: true.
class Post < ApplicationRecord
belongs_to :user, optional: true
end
post = Post.create(title: 'Hi')
=> <Post id: 2, title: "Hi", user_id: nil>
Với thêm tùy chọn ở trên thì validation sẽ bỏ qua với class Post và tất cả model còn lại sẽ vẫn bị validation.
Bỏ qua validation cho toàn bộ model trong Rails 5.
Mặc định Rails 5 setting validation cho toàn bộ model
Rails.application.config.active_record.belongs_to_required_by_default = true.
Để bỏ validation chúng ta cần seting lại giá trị sang 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">
Nguồn: http://blog.bigbinary.com/2016/02/15/rails-5-makes-belong-to-association-required-by-default.html