禁用mongoid belongs_to关联验证

Dmi*_*nko 9 ruby-on-rails mongoid

A有两个mongoid模型,它们之间有一个简单的has_many/belongs_to关系:

class Lot
  include Mongoid::Document
  has_many :journal_items
end

class JournalItem
  include Mongoid::Document
  belongs_to :lot
end
Run Code Online (Sandbox Code Playgroud)

问题是我无法创建一个JournalItem没有a Lot,因为似乎mongoid在JournalItem.lot_id默认情况下添加了非null验证.

JournalItem.create!
# raises validation error "Lot can't be blank"
Run Code Online (Sandbox Code Playgroud)

我该如何禁用它?

我使用带有Rails 5的mongoid master.

Dmi*_*nko 27

好吧,我已经明白了 - mongoid协会有optional选择权,似乎没有很好地记录.

所以它应该是:

class JournalItem
  include Mongoid::Document
  belongs_to :lot, optional: true
end
Run Code Online (Sandbox Code Playgroud)


小智 8

在Rails 5中,belongs_to默认为必需:true(参见rails/rails/pull/18937)

所以现在需要:true已被弃用:

belongs_to :company, required: true # deprecated => `required: true`
Run Code Online (Sandbox Code Playgroud)

要在基于ActiveRecord的应用程序上禁用此选项,您应该创建一个初始化程序,以显式配置应用程序的新行为:

# config/initializers/active_record_belongs_to_required_by_default.rb

Rails.application.config.active_record.belongs_to_required_by_default = true
Run Code Online (Sandbox Code Playgroud)

对于不需要的每个belongs_to关系,只需添加optional:true.

belongs_to :company, optional: true
Run Code Online (Sandbox Code Playgroud)

对于Mongoid +6.0,您需要在Mongoid初始化程序中添加此选项:

# config/initializers/mongoid.rb
Mongoid::Config.belongs_to_required_by_default = false
Run Code Online (Sandbox Code Playgroud)