【发布时间】:2020-01-22 03:35:55
【问题描述】:
我在 Rails 应用程序中有以下模型。此设置运行良好,因为通常当我想向供应商添加新的 VendorPromo 时,可用 Promos 视图中有一个下拉菜单可供选择。现在,我正在通过 API 启用新的 VendorPromos 的创建。但是,此当前设置将允许创建具有任何 promo_id 的 VendorPromo,即使它在 Promo 中不存在。我见过belongs_to :promo, foreign_key: :promo,我知道您也可以通过数据库添加外键约束。我想知道这两种方法之间的区别以及哪种方法更好?
编辑:我认识到应用程序约束与 DB 约束不同,但是当我在应用程序中应用约束时,即 belongs_to :promo, foreign_key: :promo 它实际上似乎根本没有强制执行约束。具体来说,我可以创建一个新的 VendorPromo,其 promo_id 为 13,即使 Promo 只有 1 到 8 之间的 ID。
class Vendor
has_many :vendor_promos
end
class VendorPromo
belongs_to :vendor
belongs_to :promo
end
class Promo
end
【问题讨论】:
-
外键约束帮助我们维护有效数据,也是帮助我们避免应用程序中出现意外 nil 值的另一种方式。期望应用程序逻辑单独提供相同级别的保护是不现实的。
-
我认为 id 超出范围,除非您对其他属性进行存在验证,否则它会创建该记录。您可以在数据库和模型中放置空约束,以确保在没有其他属性的情况下无法创建模型。
标签: sql ruby-on-rails database activerecord foreign-keys