2011-12-03 12 views
2

私は奇妙な魔法の問題を持っている!レールと外部キー

私は外部キーを使ってテーブルを作成しました(私はsparkfly-foreigner gemを使用しています)。

class CreateCourses < ActiveRecord::Migration 
    def change 
    create_table :courses do |t| 
     t.string :coursename, 
     t.integer :subject, 
     t.integer :theme, 
     t.integer :hours, 
     t.decimal :price, 
     t.foreign_key :subject, :column => :subject, :dependent => :delete 
     t.foreign_key :theme, :column => :theme, :dependent => :delete 
     t.timestamps 
    end 
    end 
end 

これは、端末と私のレールwebappでうまく動作します。

次に、別のテーブルを作成しています。

class CreateGroupps < ActiveRecord::Migration 
    def change 
    create_table :groupps do |t| 
     t.string :groupname 
     t.integer :courseid 
     t.integer :number, 
     t.foreign_key :course, :column => :courseid, :dependent => :delete 
     t.timestamps 
    end 
    end 
end 

魔法が始まります。私はGrouppsのWebフォームに既存のcourseidは書かず、データベースにレコードを作成します!!!私が端末を使用しているとき、私はこれを得る

rails_dev=> select * from groupps 
rails_dev-> ; 
id | groupname | courseid | number |   created_at   |   updated_at   
----+-----------+----------+--------+----------------------------+---------------------------- 
    1 | 12  |   |  1 | 2011-12-03 02:51:06.154261 | 2011-12-03 02:51:06.154261 
(1 row) 

rails_dev=> insert into groupps values (2,12,0,0);                                       ERROR: insert or update on table "groupps" violates foreign key constraint "groupps_courseid_fkey" 
DETAIL: Key (courseid)=(0) is not present in table "courses". 

どのようにすることができますか?そして私が間違っているとき?私はレールやルビーでは初心者です。

答えて

1

この出力は:

id | groupname | courseid | number |   created_at   |   updated_at   
----+-----------+----------+--------+----------------------------+---------------------------- 
    1 | 12  |   |  1 | 2011-12-03 02:51:06.154261 | 2011-12-03 02:51:06.154261 
(1 row) 

あなたはcourseidにNULLを持っており、それがうまく限り、あなたのテーブルと外部キーが懸念しているようだということを示しています。あなたが参照する列でNULLを持つことが許されている、あなたはおそらくあなたのcourseid:null => falseを追加したい:

create_table :groupps do |t| 
    t.string :groupname 
    t.integer :courseid, :null => false 
    t.integer :number, 
    t.foreign_key :course, :column => :courseid, :dependent => :delete 
    t.timestamps 
end 

をところで、あなたはpsqlですでにしているので、あなたのテーブルの構造を見るために\d grouppsを使用することができ、制約(FKを含む)、さらにどのFKがあなたのテーブルを参照するのかを示します。また​​に興味があるかもしれない:

null
はNULL値の代わりに、印刷される文字列を設定します。デフォルトでは何も印刷されないので、空の文字列と間違えてしまうことがあります。例えば、\pset null '(null)'を好むかもしれません。

+0

ありがとうございました。私は解決策が単純でなければならず、また愚かな間違いがあることを知っていました。 – evilgeniuz

+0

t.foreign_key ':courses'テーブル名 –