web-dev-qa-db-ja.com

ActiveRecordで外部キー制約を作成する

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を使用する

13
at.

関係を正しくマップするためにActiveRecordに外部キー制約は必要ありません。 validations を使用して、Railsアプリにデータの整合性を保証させることができます。

Railsの移行では、外部キーを作成するためのヘルパーは提供されません。移行の制約に対して独自のSQLを作成するか、 Foreigner Gem を使用できます。外国人は、移行で制約を作成するためのヘルパーメソッドを提供します。

add_foreign_key(:students, :levels)
13
mguymon

Rails> = 4.2で、mysqlmysql2、またはpostgresqlアダプターを使用している場合は、次のように移行でadd_foreign_keyメソッドを使用できます。

# add a foreign key to `articles.author_id` referencing `authors.id`
add_foreign_key :articles, :authors

APIリファレンス

13
Segfault

これはRailsに組み込まれているので、Foreignerは必要ありません。ここのセクション3.6外部キーを参照してください: http://edgeguides.rubyonrails.org/active_record_migrations.html

3
DB140141

モデルに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

詳細については、 レールガイド を確認してください。

2
claptimes
   $ 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

2
xhenryx14