1

マルチテーブルの継承とデータベースの制約で遊んでいます。Railsの哲学は、データベースではなくコードで制約を処理することであることは知っていますが、両方を行いたいと思っています。ポリモーフィックな関連付けについても知っていますが、制約を強制することはできません。

したがって、これが私のシナリオです。ガイドのようにimageable_typeandを使用する代わりに、 and を使用したいと思います(私の場合、外部キーは2つしかありません)。これにより、ここで説明したような制約を作成できます。imageable_idemployee_idproduct_id

しかし、今、問題があります。条件付きの関係を作成する必要がありますが、Rails はそのためのものを提供していないようです。imageableどのフィールドが入力されているかに応じて、製品または従業員にリンクされている関係が必要です。

Railsでそれを行う方法について何か提案はありますか? 私は SQL で制約を行う方法を知っています。私の質問は、このポリモーフィックな関係を Rails でどのように実装できるかです。

繰り返しますが、データベースの制約なしでそれを行う方法は知っていますが、データベースの制約はまさに私の質問のポイントです:)

4

1 に答える 1

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それぞれがそれぞれのテーブルの PKを参照し、NULL にすることができます。
  • CHECK 制約employee_xor_picture、両方の少なくとも 1 つが常に 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 に答える