як рейки знають, що user_idце зовнішній ключ user?
Сам Рейлс не знає, що user_idце зовнішній ключ user. У першій команді rails generate model Micropost user_id:integerвін додає лише стовпчик, user_idпроте рейки не знають використання кола. Потрібно вручну поставити лінію в Micropostмоделі
class Micropost < ActiveRecord::Base
belongs_to :user
end
class User < ActiveRecord::Base
has_many :microposts
end
ключові слова belongs_toта has_manyвизначити взаємозв'язок між цими моделями та оголосити user_idяк зовнішній ключ до Userмоделі.
Пізніша команда rails generate model Micropost user:referencesдодає рядок belongs_to :userу Micropostмодель і цим декларується як зовнішній ключ.
FYI
Оголошення зовнішніх ключів за допомогою колишнього методу дає лише Rails знати про взаємозв'язок моделей / таблиць. База даних про відносини невідома. Тому, коли ви генеруєте діаграми EER, використовуючи програмне забезпечення, подібне до того, що MySql Workbenchви виявляєте, що між моделями немає міжрядкових зв'язків. Як на наступному малюнку

Однак якщо ви використовуєте більш пізній метод, ви виявите, що файл міграції виглядає так:
def change
create_table :microposts do |t|
t.references :user, index: true
t.timestamps null: false
end
add_foreign_key :microposts, :users
Тепер зовнішній ключ встановлюється на рівні бази даних. і ви можете генерувати правильні EERдіаграми.
