has_one 与可选关联:true?

use*_*745 2 activerecord ruby-on-rails has-one ruby-on-rails-6

在一个简单的预订应用程序中:

  • 当用户选择座位时,TempAppointment会创建一个。
  • 支付座位费用后,将根据 TempAppointment 记录中的信息创建约会。

无法首先创建约会记录,因为乘客可能不付款,在这种情况下,临时约会保持不变,并且永远不会创建关联的约会记录。

我的自然想法是 TempAppointment has_one Appointment (有效),但是当我添加时optional: true,我看到错误

class TempAppointment < ApplicationRecord
  has_one :appointment, optional: true 
end
Run Code Online (Sandbox Code Playgroud)

尝试创建一个新的临时约会

ta = TempAppointment.new(cruise_id: 1, passenger_id: 1, start_time: start_time, end_time: start_time + 3600)
ArgumentError: Unknown key: :optional. Valid keys are: :class_name, :anonymous_class, :foreign_key,
 :validate, :autosave, :foreign_type, :dependent, :primary_key, :inverse_of, :required, :as, :touch
Run Code Online (Sandbox Code Playgroud)

为什么不能has_one与 一起工作optional: true

luc*_*sef 6

has_one默认情况optional: true下(即使它实际上不是此方法的一个选项,我的意思是 has_one 永远不会意味着它是必需的)

因此,如果您为另一个模型设置Optional: true,请小心,这意味着该另一个模型不需要与第一个模型有关系。这是一种单向依赖。

# your model_a doesn't need any model_b to exist
class ModelA < ApplicationRecord
  belongs_to :model_b, optional: true
  
  [...]
end

# same for model_b, it can exist without model_a
class ModelB < ApplicationRecord
  has_one :model_a
  
  [...]
end
Run Code Online (Sandbox Code Playgroud)

但如果你这样做

# your model_a has to belong to a model_b, otherwise it will fail
class ModelA < ApplicationRecord
  belongs_to :model_b
  
  [...]
end

# your model_b can still exist without model_a
class ModelB < ApplicationRecord
  has_one :model_a
  
  [...]
end
Run Code Online (Sandbox Code Playgroud)