【问题标题】:has_one association with optional: true?has_one 与可选关联:true?
【发布时间】: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


【解决方案1】:

我切换了模型关联并且它起作用了。

AFAIK,在应用程序的任何地方都没有区别。

一些有用的提示here

以下是有效的:

class Appointment < ApplicationRecord
  has_one :temp_appointment 
end
class TempAppointment < ApplicationRecord
  belongs_to :appointment, optional: true 
end

【讨论】:

    【解决方案2】:

    在定义了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

    【讨论】:

      猜你喜欢
      • 2014-01-10
      • 1970-01-01
      • 1970-01-01
      • 2013-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多