我的应用程序有一个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,但它也会被回滚。
答案 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