Как добавить внешний ключ в миграции рельсов с другим именем таблицы
Как назначить другое имя таблицы с добавлением внешнего ключа. например,
У меня есть модель вроде
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