Как добавить внешний ключ в миграции рельсов с другим именем таблицы

Как назначить другое имя таблицы с добавлением внешнего ключа. например,

У меня есть модель вроде

class MyPost < ActiveRecord::Base
  has_many :comments, class_name: PostComment
end

class PostComment < ActiveRecord::Base
  belongs_to :post, class_name: MyPost
end

Теперь я хочу изменить файл миграции следующим образом:

class CreatePostComments < ActiveRecord::Migration
  def change
    create_table :post_comments do |t|
     t.belongs_to :post, index: true
     t.timestamps null: false
    end
    add_foreign_key :post, :class_name => MyPost
  end
end 

Но он не работает. Миграция отменяется. Как изменить файл миграции для работы с моей структурой модели.

Ответ 1

Вы можете передать параметры для внешнего ключа следующим образом:

class CreatePostComments < ActiveRecord::Migration
  def change
    create_table :post_comments do |t|
      t.references :post, foreign_key: { to_table: :my_posts }, index: true
      t.timestamps null: false
    end
  end
end

Это также верно для параметра индекса, если вы хотите добавить уникальное ограничение:

t.references :post, foreign_key: { to_table: :my_posts }, index: { unique: true}

Кстати, ссылки - это псевдоним для belongs_to, или, если быть более точным, belongs_to - это псевдоним для ссылок.

Подробности смотрите в реализации rails 5.0.rc2 & Рельсы 4.2

Ответ 2

Он должен выглядеть так:

class CreatePostComments < ActiveRecord::Migration
  def change
    create_table :post_comments do |t|
     t.belongs_to :post, index: true
     t.timestamps null: false
    end
    add_foreign_key :post_comments, :my_posts, column: :post_id
  end
end 

Взгляните на документацию: http://apidock.com/rails/ActiveRecord/ConnectionAdapters/SchemaStatements/add_foreign_key

Вы используете параметр column, если столбец назван по-разному.

Ответ 3

Попробуйте это

class CreatePostComments < ActiveRecord::Migration
  def change
    create_table :post_comments do |t|
      t.references :my_post, index: true
      t.timestamps null: false
    end
    add_foreign_key :my_post, :post_comments
  end
end