2011-12-28 4 views
6

はRailsの3.1で何とかこれを構築し、次のとおりです。 UMLxor条件、レール、外部キー、およびsqliteデータベースを扱うにはどうすればいいですか?私が欲しいもの

Ab_idのIDを設定している場合、それはc_idのIDを設定することはできないはずです。そして確かにその逆も同じです。

私は、移行からデータベースレベルで行うことができます(チェック制約?)。これは何とか可能ですか? または、検証でモデルでこれを行う方が手頃ですか?

私の環境:

  • ルビー1.9.3
  • のRails 3.1.3
  • のSQLite 3.7.3

答えて

2

あなたは、スキーマウォン」altho、ポリモーフィック団体を介してこれを達成することができますあなたが持っているものとまったく同じように見えますが、同じ目標を達成することができます。ABまたはCに属しますが、どちらにも属していません。

あなたがここで詳細を読むことができます:http://guides.rubyonrails.org/association_basics.html#polymorphic-associationsそのリンク上で与えられた例では

は、Aが彼らのPictureあり、かつEmployeeProudctがあり、あなたのBC

(ソース上記のリンクからコピー):

class Picture < ActiveRecord::Base 
    belongs_to :imageable, :polymorphic => true 
end 

class Employee < ActiveRecord::Base 
    has_many :pictures, :as => :imageable 
end 

class Product < ActiveRecord::Base 
    has_many :pictures, :as => :imageable 
end 
+0

は、あなたの答えをありがとう私のために働くように見えた、制約を変更することで、これを変更することができます! @ Frederickの答えと組み合わせて、私は私の質問に完全な解決策を得るでしょう。 – Robin

+1

私は@ mynameiscoffeyの答えにもっと同意します。表Aに外来キーの列が1つだけあるので、表Aに 'imageable_id'と' imageable_type'があります。 –

0

私は確かにこれについての検証を書いています - 良いエラーメッセージを提供する方が簡単です検証からユーザに通知する。私はまたデータベースの制約でそれをバックアップしたいと思います。それは確かにチェック制約が仕事をすることができるように見えます。

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) 

+0

ありがとうございます! @ mynameiscoffeyの答えと組み合わせて、私は私の質問に完全な解決策を得るでしょう。 – Robin

関連する問題