Рельсы и внешние ключи - PullRequest
       10

Рельсы и внешние ключи

2 голосов
/ 03 декабря 2011

У меня дурацкая проблема с магией в рельсах!

Итак, я создал таблицу с внешним ключом (я использую камень sparkfly-foreigner).

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

Этопрекрасно работает в терминале и в моем приложении rails.

Затем я создаю другую таблицу.

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, и он создает запись в базе данных !!!Когда я использую терминал, я получаю это

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 Ответ

1 голос
/ 03 декабря 2011

Этот вывод:

 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)

означает, что у вас есть NULL в courseid, и это просто замечательно, что касается вашей таблицы и внешнего ключа. Вам разрешено иметь значение NULL в ссылочном столбце, возможно, вы хотите добавить :null => false к вашему courseid:

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 ссылаются на вашу таблицу. Вы также можете быть заинтересованы в \pset null:

null
Устанавливает строку для печати вместо нулевого значения. По умолчанию ничего не печатается, что можно легко принять за пустую строку. Например, можно предпочесть \pset null '(null)'.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...