1

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

所以这是我的场景,而不是在guidesimageable_type中拥有and ,我想拥有and (在我的情况下,我将只有两个外键)。这让我可以像这里解释的那样创建一个约束。imageable_idemployee_idproduct_id

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

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

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

4

1 回答 1

1

假设您希望最多允许1次引用employeeor product

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_id并且product_id每个引用各自表的PK并且可以为NULL。
  • CHECK 约束 强制要求两者employee_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)
于 2014-12-07T22:03:51.107 回答