Ответ 1
Сделайте это вручную:
add_column :post, :author_id, :integer
но теперь, когда вы создаете оператор belongs_to, вам придется изменить его, поэтому теперь вы должны вызвать
def post
belongs_to :user, :foreign_key => 'author_id'
end
Я хочу сделать migration
в Rails, ссылаясь на другую таблицу. Обычно я бы сделал что-то вроде:
add_column :post, :user, :references
Создает столбец с именем user_id
в таблице posts
. Но что, если вместо user_id
я хочу что-то вроде author_id
? Как я могу это сделать?
Сделайте это вручную:
add_column :post, :author_id, :integer
но теперь, когда вы создаете оператор belongs_to, вам придется изменить его, поэтому теперь вы должны вызвать
def post
belongs_to :user, :foreign_key => 'author_id'
end
В Rails 4. 2+ вы также можете установить внешние ключи в БД, что является отличной идеей.
Для простых ассоциаций это можно сделать также с помощью t.references
добавив foreign_key: true
, но в этом случае вам понадобятся две строки.
# The migration
add_reference :posts, :author, index: true
add_foreign_key :posts, :users, column: :author_id
# The model
belongs_to :author, class_name: "User"
Если вы определяете таблицу моделей Post
, вы можете установить references
, index
и foreign_key
в одну строку:
t.references :author, index: true, foreign_key: { to_table: :users }
Если вы добавляете ссылки на существующую таблицу, вы можете сделать это:
add_reference :posts, :author, foreign_key: { to_table: :users }
Примечание: Значение по умолчанию для index
равно true.
В rails 4 при использовании postgresql и gem schema_plus вы можете просто написать
add_reference :posts, :author, references: :users
Это создаст столбец author_id
, который правильно ссылается на users(id)
.
А в твоей модели ты пишешь
belongs_to :author, class_name: "User"
Обратите внимание, что при создании новой таблицы вы можете написать ее следующим образом:
create_table :things do |t|
t.belongs_to :author, references: :users
end
Примечание: гем
schema_plus
во всей его полноте не совместим с rails 5+, но эта функциональность предоставляется gem schema_auto_foreign_keys (часть schema_plus), которая совместима с rails 5.
Если вы не используете внешний ключ, то не имеет значения, каково фактическое имя таблицы другой таблицы.
add_reference :posts, :author
По Rails 5, если вы используете внешний ключ, вы можете указать имя другой таблицы в параметрах внешнего ключа. (см. https://github.com/rails/rails/issues/21563 для обсуждения)
add_reference :posts, :author, foreign_key: {to_table: :users}
До Rails 5 вы должны добавить внешний ключ как отдельный шаг:
add_foreign_key :posts, :users, column: :author_id
alias_attribute (new_name, old_name) очень удобно. Просто создайте свою модель и отношения:
rails g model Post title user:references
затем отредактируйте модель и добавьте псевдоним атрибута с помощью
alias_attribute :author, :user
После этого вы сможете запускать такие вещи, как
Post.new(title: 'My beautiful story', author: User.first)