Ответы:
Сделайте это вручную:
add_column :post, :author_id, :integer
но теперь, когда вы создаете оператор own_to, вам придется его изменить, поэтому теперь вам нужно вызвать
def post
belongs_to :user, :foreign_key => 'author_id'
end
schema_plus
gem, t.references :category, index: true, foreign_key: true, references: :match_categories
также работал у меня в файле миграции.
Если вы определяете вашу 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.
null
s. Чтобы не допустить их, добавьте обычный вариант null: false
.
В Rails 4.2+ вы также можете установить внешние ключи в db, что является отличной идеей .
Для простых ассоциаций это можно сделать и при 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"
references: :users
опция add_reference
звонка. Я не вижу, чтобы это было задокументировано в документации, и, похоже, с моей стороны он работает без этого.
В rails 4 при использовании postgresql и гема 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+, но эта функциональность предлагается гем schema_auto_foreign_keys (часть schema_plus), который совместим с rails 5.
create_table
:t.references :author, references: :users
:references
действительно что-то делают.
schema_plus
драгоценный камень целую вечность, и он фактически добавляет эту функциональность. Я соответствующим образом отредактировал свой ответ.
t.references :col_name, references: other_table_name
работает без установки дополнительных гемов.
Если вы не используете внешний ключ, то не имеет значения, каково фактическое имя другой таблицы.
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
{to_table: :users}
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)