has_one association with optional: true?



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

  • 当用户选择一个座位时,创建一个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

相关内容

  • 没有找到相关文章

最新更新