0

外部キーを作成したいのですが、作成に失敗します (teacher_id、course_id の外部キー)。

コードを参照してください - 外部キーを生成するには何を変更すればよいですか?

ケースアプリ=学校

手順:

コンソール:

rails new school
rails g model teacher name:string
rails g model course name:string
rails g model teachercourse teacher_id:integer course_id:integer

モデルにコードを追加します。

class Course < ActiveRecord::Base
  attr_accessible :name
  has_many :teachers, through: :teachercourse
end

class Teacher < ActiveRecord::Base
  attr_accessible :name
  has_many :courses, through: :teachercourse
end

class Teachercourse < ActiveRecord::Base
  attr_accessible :course_id, :teacher_id
  belongs_to :course
  belongs_to :teacher
end

移行にコードを追加:

class CreateTeachercourses < ActiveRecord::Migration
  def change
    create_table :teachercourses do |t|
      t.integer :teacher_id
      t.integer :course_id

      t.timestamps
    end
    add_index :teacher_id
    add_index :course_id
  end
end

コンソール:

rake db:migrate
rake db:schema:load

mysql db innodb 部分ダンプ (teach_id、course_id の外部キーなし):

CREATE TABLE IF NOT EXISTS `courses` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `created_at` datetime NOT NULL,
  `updated_at` datetime NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;

CREATE TABLE IF NOT EXISTS `teachercourses` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `teacher_id` int(11) DEFAULT NULL,
  `course_id` int(11) DEFAULT NULL,
  `created_at` datetime NOT NULL,
  `updated_at` datetime NOT NULL,
  PRIMARY KEY (`id`),
  KEY `index_teachercourses_on_course_id` (`course_id`),
  KEY `index_teachercourses_on_teacher_id` (`teacher_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;

CREATE TABLE IF NOT EXISTS `teachers` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `created_at` datetime NOT NULL,
  `updated_at` datetime NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;
4

2 に答える 2

3

コードを改善するためにいくつかの変更を提案するだけですが、@Sandip の答えはこの SO の質問に従って正しいです:なぜ Rails migrations はアプリケーションで外部キーを定義するのにデータベースでは定義しないのですか?

モデル

class Course < ActiveRecord::Base
  attr_accessible :name
  has_many :teachercourses
  has_many :teachers, through: :teachercourses
end

class Teacher < ActiveRecord::Base
  attr_accessible :name
  has_many :teachercourses
  has_many :courses, through: :teachercourses
end

class Teachercourse < ActiveRecord::Base
  attr_accessible :course_id, :teacher_id
  belongs_to :course
  belongs_to :teacher
end

移行

class CreateTeachercourses < ActiveRecord::Migration
  def change
    create_table :teachercourses do |t|
      t.integer :teacher_id
      t.integer :course_id

      t.timestamps
    end
    add_index :teachercourses, :teacher_id
    add_index :teachercourses, :course_id
  end
end
于 2012-08-14T11:03:47.293 に答える
2

デフォルトでは、レールはどの関連付けに対しても外部キーを生成しません。DB 内にforeign_keysが必要だと思う場合は、それらを手動で追加する必要があります。

于 2012-08-14T10:50:42.407 に答える