私は確かにこれについての検証を書いています - 良いエラーメッセージを提供する方が簡単です検証からユーザに通知する。私はまたデータベースの制約でそれをバックアップしたいと思います。それは確かにチェック制約が仕事をすることができるように見えます。
Railsにはこれがサポートされていないため、raw SQLを使用してテーブルを作成する必要があります。また、実際にこれを記述するschema.rb
を生成することができないため、スキーマダンプを:sql
に変更する必要があります。
私はレールコンソール
Foo.create(:x_id => 1, :y_id => 1) #=> SQLite3::ConstraintException
それはあなたがどちらX_IDもy_idセットで行を作成することができますされたように続いて、この移行
class CreateFoos < ActiveRecord::Migration
def change
execute <<SQL
CREATE TABLE foos (
id INTEGER PRIMARY KEY,
x_id INTEGER,
y_id INTEGER,
constraint xorit check((x_id OR y_id) AND NOT(x_id AND y_id))
)
SQL
end
end
を書きました。あなたは
(x_id IS NOT NULL OR y_id IS NOT NULL) AND (x_id IS NULL OR y_id IS NULL)
が
は、あなたの答えをありがとう私のために働くように見えた、制約を変更することで、これを変更することができます! @ Frederickの答えと組み合わせて、私は私の質問に完全な解決策を得るでしょう。 – Robin
私は@ mynameiscoffeyの答えにもっと同意します。表Aに外来キーの列が1つだけあるので、表Aに 'imageable_id'と' imageable_type'があります。 –