Відповіді:
Зробіть це вручну:
add_column :post, :author_id, :integer
але тепер, коли ви створюєте оператор pripada_то, вам доведеться його модифікувати, тому тепер вам доведеться зателефонувати
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
дзвінку. Я не бачу це документально зафіксовано в документах, і, здається, він працює на моєму кінці без цього.
У рейках 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
дорогоцінний камінь у повному обсязі не сумісний з рейками 5+, але цю функціональність пропонують дорогоцінний камінь schema_auto_foreign_keys (частина schema_plus), сумісний з рейками 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/isissue/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)