允许引用为空的自连接关联可以完成吗?

Can a self join association be done allowing the reference to be blank?

我的应用有一个 Waiter 模型来管理等候名单上的人员名单。 'waiters' 中的每个人都可以推荐其他人加入列表。另外,我想查明谁推荐了特定的服务员。

我已经定义了一个自连接关联,这样每个服务员都可以被引用到一个裁判所以我在我的模型中做了以下事情:

#models/waiter.rb
class Waiter < ApplicationRecord
  has_many :referrals, class_name: "Waiter",
                            foreign_key: "referee_id"
  belongs_to :referee, class_name: "Waiter"
end

加迁移了以下迁移:

class AddRefereeReferenceToWaiters < ActiveRecord::Migration[5.1]
  def change
    add_reference :waiters, :referee, index: true
  end
end

这似乎是一个合乎逻辑的解决方案,但是,某些 'waiters' 可能不会被任何人推荐,在这种情况下,我想将 referee_id 留在 Waiters table空白的。同样的情况发生在第一个服务员身上(谁不会被任何人推荐。

因此,在尝试将任何新服务员保存到数据库时,我面临回滚错误 :referee=>["must exist"]

是否可以指示 rails 不验证引用 ID 的存在?

我尝试在控制器为空时添加一个 referee_id 为零,但这也会回滚。

Since Rails 5 当您定义 belongs_to 关联时,它默认是必需的

要使 referee 可选,您需要提供 optional: true 选项:

class Waiter < ApplicationRecord
  has_many :referrals, class_name: "Waiter",
                        foreign_key: "referee_id"
  belongs_to :referee, class_name: "Waiter", optional: true
end

Is it possible then to instruct rails to not validate the presence of a reference id?

如果你正在使用Rails5,你可以添加optional: true告诉Rails不要验证[=12的存在=]

来自Guides

If you set the :optional option to true, then the presence of the associated object won't be validated. By default, this option is set to false.

  belongs_to :referee, class_name: "Waiter", optional: true