ActiveRecordで外部キーを作成するにはどうすればよいですか?私のモデルには次のようなものがあります。
class Student < ActiveRecord::Base
attr_accessible :name, :level_id
belongs_to :level
end
class Level < ActiveRecord::Base
attr_accessible :number
has_many :students
end
しかし、schema.rbと開発sqlite3データベースには、level_idフィールドで外部キー制約が設定されたことを示すものはありません。これは、ActiveRecordやRailsとは別に、手動で行う必要があることですか?私は一歩を逃しましたか?
Rails 3.2.8を使用する
関係を正しくマップするためにActiveRecordに外部キー制約は必要ありません。 validations を使用して、Railsアプリにデータの整合性を保証させることができます。
Railsの移行では、外部キーを作成するためのヘルパーは提供されません。移行の制約に対して独自のSQLを作成するか、 Foreigner Gem を使用できます。外国人は、移行で制約を作成するためのヘルパーメソッドを提供します。
add_foreign_key(:students, :levels)
Rails> = 4.2で、mysql
、mysql2
、またはpostgresql
アダプターを使用している場合は、次のように移行でadd_foreign_key
メソッドを使用できます。
# add a foreign key to `articles.author_id` referencing `authors.id`
add_foreign_key :articles, :authors
これはRailsに組み込まれているので、Foreignerは必要ありません。ここのセクション3.6外部キーを参照してください: http://edgeguides.rubyonrails.org/active_record_migrations.html
モデルにbelong_to
行とhas_many
行を追加すると、Railsはそれらの関係を認識し、ヘルパーメソッドを生成しますが、データベースレベルでFKを作成しません。これを行うには、移行を作成して実行する必要があります。
Rails g migration add_level_id_to_students level_id:integer
次に、db:migrateをレーキします
外部キー部分を使用してモデルを生成する場合は、references
ショートカットを使用できます:Rails g model Student name:string level:references
詳細については、 レールガイド を確認してください。
$ Rails generate migration AddStudentRefToLevels student:references
これはこのようなものになるはずです
class AddStudentRefToLevels < ActiveRecord::Migration
def change
add_reference :levels, :student, index: true
end
end
ここから取得 http://guides.rubyonrails.org/migrations.html#creating-a-migration