可以进行自联接关联,允许引用为空白吗?

时间:2017-07-26 08:15:19

标签: ruby-on-rails self-join

我的应用程序有一个Waiter模型来管理等待名单上的人员列表。每个“服务员”都可以推荐其他人,以便他们加入名单。另外,我想跟踪一位特定服务员的推荐信。

我已经定义了一个自我加入关联,这样每个服务员都可以被引用给裁判,所以我在我的模型中完成了以下操作:

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

Plus迁移了以下迁移:

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

这似乎是一个合乎逻辑的解决方案,但是,某些“服务员”可能不会被任何人推荐,在这种情况下,我想将wafers表中的referee_id留空。第一位服务员也是如此(任何人都不会推荐他们。

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

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

我已经尝试在控制器中添加一个零的referee_id,但它也会被回滚。

2 个答案:

答案 0 :(得分:2)

Since Rails 5当您定义默认情况下需要的belongs_to关联时

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

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

答案 1 :(得分:1)

  

是否有可能指示rails不验证是否存在   参考ID?

如果您使用的是 Rails 5 ,则可以添加optional: true告诉Rails不要验证是否存在referee_id

来自Guides

  

如果将:optional选项设置为true,则表示存在   相关对象将不会被验证。默认情况下,此选项已设置   为假。

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