Указание имени столбца в миграции ссылок

Я хочу сделать migration в Rails, ссылаясь на другую таблицу. Обычно я бы сделал что-то вроде:

add_column :post, :user, :references

Создает столбец с именем user_id в таблице posts. Но что, если вместо user_id я хочу что-то вроде author_id? Как я могу это сделать?

Ответ 1

Сделайте это вручную:

add_column :post, :author_id, :integer

но теперь, когда вы создаете оператор belongs_to, вам придется изменить его, поэтому теперь вы должны вызвать

def post
    belongs_to :user, :foreign_key => 'author_id'
end

Ответ 2

В 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"

Ответ 3

Для Rails 5 +

Начальное определение:

Если вы определяете таблицу моделей 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.

Ответ 4

В 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.

Ответ 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

Ответ 6

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)