откуда рельсы знают, что user_idэто ссылка на внешний ключ user?
Сам Rails не знает, что user_idэто ссылка на внешний ключ user. В первой команде rails generate model Micropost user_id:integerон только добавляет столбец, user_idоднако rails не знает, как использовать col. Вам нужно вручную поставить линию в 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модель и тем самым объявляет как внешний ключ.
К вашему сведению
Объявление внешних ключей с использованием предыдущего метода позволяет только 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диаграммы.
