【发布时间】:2021-01-23 08:20:06
【问题描述】:
在一个简单的预订应用中:
- 当用户选择座位时,会创建一个
TempAppointment。 - 支付席位后,会根据 TempAppointment 记录中的信息创建约会。
不能先创建约会记录,因为乘客可能不付款,在这种情况下,临时约会保持原样,并且永远不会创建关联的约会记录。
我的自然想法是 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 一起使用?
【问题讨论】:
-
您想要两个不同的表而不是使用像枚举这样更简单的解决方案是他们的具体原因吗?
-
@max tbh 我不知道如何用枚举解决。我确实考虑了一个更简单的解决方案:在 Appointment 中添加一个“paid”(t/f)列,甚至没有 TempAppointment 表。问题是 Appointment 上的每个现有查询都必须有一个
.where(paid: t),所以我采用了两表方法。你有没有推荐我可以阅读枚举的地方? -
您必须在 belongs_to 模型中而不是在 has_one 中提供
optional: true。
标签: ruby-on-rails activerecord ruby-on-rails-6 has-one