在一个简单的预订应用程序中:
- 当用户选择一个座位时,创建一个
TempAppointment
。 - 座位付费后,根据TempAppointment记录中的信息创建一个约会。
不能首先创建Appointment记录,因为乘客可能不付款,在这种情况下,TempAppointment保持不变,并且永远不会创建关联的Appointment记录。
我的自然想法是一个TempAppointment has_one Appointment(这是有效的),但是当我添加optional: true
时,我看到错误:
class TempAppointment < ApplicationRecord
has_one :appointment, optional: true
end
尝试创建一个新的TempAppointment
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
为什么has_one
不能和optional: true
一起工作?
has_one
默认为optional: true
(即使它不是这个方法的真正选项,我的意思是has_one从不意味着它是必需的)
所以如果你将可选的: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
但是如果你做了
# 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
我切换了模型关联,它工作了。
我敢说,这在应用程序的任何地方都没有区别。
这里有一些有用的提示
是这样的:
class Appointment < ApplicationRecord
has_one :temp_appointment
end
class TempAppointment < ApplicationRecord
belongs_to :appointment, optional: true
end
在定义has_one
关系的模型上,我认为您可能能够使用required: false
。所以最后,它看起来像这样:
class Appointment < ApplicationRecord
has_one :temp_appointment, required: false
end
class TempAppointment < ApplicationRecord
belongs_to :appointment, optional: true
end
https://apidock.com/rails/ActiveRecord/Associations/ClassMethods/has_one