1

我一直在玩多表继承和数据库约束。我知道Rails的哲学是处理代码中的约束,而不是数据库中的约束,但是我想这样做。我也知道多态关联,但他们不让你执行约束。Rails与多个外键和数据库约束的多态关联

因此,这里是我的方案,而不必imageable_typeimageable_idguides,我想有employee_idproduct_id(在我的情况下,我只会有两个外键)。这可以让我创建一个像解释here一样的约束。

但现在,我有一个问题,我需要创建一个条件关系和铁路似乎并没有提供任何东西。我需要一个imageable关系,该关系或者链接到产品或员工,具体取决于填充哪个字段。

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

再一次,我知道该怎么做,没有数据库的约束,但数据库的约束是我的问题:)

+0

您希望将每张图片链接到*** 1 ***员工或产品(xor)?没有更多?至少要求两者之一?从来都没有? – 2014-12-07 21:46:53

回答

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Ò f各个表可以为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) 
+0

我很欣赏答案,但我的问题是关于Rails的实现。如何对这种设计和约束进行多态关系。在rails中,多态性通常具有'imageable_type'和'imageable_id',并且在没有它们的情况下将不起作用。 – karellm 2014-12-08 01:12:36

+0

@ kalema:哦,对不起。我想我误解了'',但是在更新问题之前,数据库约束是我的问题的重点“。我无法在这里使用Rub语法。 – 2014-12-08 06:02:56

+0

我知道,我意识到我的问题含糊不清,这就是我编辑的原因。尽管感谢您的帮助! – karellm 2014-12-08 19:24:53