【问题标题】:Rails polymorphic association with multiple foreign keys and database constraintsRails 与多个外键和数据库约束的多态关联
【发布时间】:2014-12-07 14:58:54
【问题描述】:

我一直在玩多表继承和数据库约束。我知道 Rails 的哲学是处理代码中的约束而不是数据库中的约束,但我想两者都做。我也知道多态关联,但它们不允许您强制执行约束。

所以这是我的方案,而不是像 guides 中的 imageable_typeimageable_id,我想要 employee_idproduct_id(在我的情况下,我将只有两个外键)。这让我可以创建一个类似于 here 解释的约束。

但是现在,我有一个问题,我需要创建一个条件关系,而 rails 似乎没有为此提供任何东西。我需要一个imageable 关系,它可以链接到产品或员工,具体取决于填写的字段。

任何建议如何在 Rails 中做到这一点?我知道如何在 SQL 中进行约束,我的问题是如何在 Rails 中实现这种多态关系。

再一次,我知道如何在没有数据库约束的情况下做到这一点,但数据库约束是我的问题的重点:)

【问题讨论】:

  • 您希望每张图片都准确链接到 1 个员工或产品(异或)?再也没有了?至少需要两者之一?从不两者兼而有之?

标签: ruby-on-rails postgresql ruby-on-rails-4 polymorphic-associations multi-table-inheritance


【解决方案1】:

假设您希望最多允许 1 引用 employeeproduct

CREATE TABLE picture (
  picture_id serial PRIMARY KEY
, picture text NOT NULL
, employee_id int REFERENCES employee
, product_id int REFERENCES product
, CONSTRAINT employee_xor_picture
       CHECK (employee_id IS NULL OR product_id IS NULL)
);
  • employee_idproduct_id 每个reference 各自表的PK,可以为NULL。
  • CHECK constraintemployee_xor_picture 强制要求两者中至少有一个始终保持为 NULL。

它确实强制两者之一是NOT NULL - 通常允许尚未分配的图片更方便,但这实际上取决于您的要求。为了强制执行:

    CHECK (employee_id IS NULL AND product_id  IS NOT NULL OR
           product_id  IS NULL AND employee_id IS NOT NULL)

【讨论】:

  • 我很欣赏这个答案,但我的问题是关于 Rails 的实现。如何与这种设计和约束建立多态关系。在 Rails 中,多态通常有 imageable_typeimageable_id,没有它们就无法工作。
  • @kalema:哦,对不起。我想在您更新问题之前我误解了"but database constraints are the very point of my question"。我无法帮助这里的 Rub 语法。
  • 我知道,我意识到我的问题模棱两可,这就是我编辑的原因。不过感谢您的帮助!
猜你喜欢
  • 2013-10-20
  • 2014-08-29
  • 1970-01-01
  • 2015-04-18
  • 2011-12-18
  • 2013-03-12
  • 2011-07-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多