Определите отношение у модели без миграции, которая добавляет ограничение FK? - PullRequest
0 голосов
/ 30 мая 2019

Когда мы определяем отношения между двумя таблицами в Rails, мы обычно делаем как

  1. Команда запуска для создания файла миграции, например rails g migration AddUserToTask user:belongs_to
  2. И добавить строку в модель, чтобы определить тип отношений, таких как has_many :users

Тогда как насчет шага 2, который просто добавляет строку для определения отношений в модели?

Это работает?

Если так, почему мы обычно делаем шаг1?

=====

И что происходит в случае, как показано ниже?

  1. Просто создаю столбец, который необходим для ассоциации (например, user_id). И этот столбец не имеет ограничения FK на уровне sql.

  2. И добавьте строку в модель, чтобы определить тип отношений, например has_many :users, с именем столбца, которое создается на шаге 1

Это означает, что для связи существует столбец, но он не имеет ограничения FK.

Ответы [ 2 ]

0 голосов
/ 30 мая 2019

На самом деле, вы можете установить отношение, просто создав FK на таблице (миграция), и управлять всем материалом запроса вручную (установите user_id, получите с помощью user_id и т. Д.).

Когда после запуска миграции вы устанавливаете связь для моделей, на которых полагается Rails, для выполнения всей этой тяжелой работы.

Таким образом, вы можете жить без модельной ассоциации, но не без таблицы FK.

0 голосов
/ 30 мая 2019

Первый шаг создает отношение в базе данных, поэтому он добавляет столбец user_id в таблицу tasks.

После этого при сохранении задачи, например,

> task = Task.first
> task.user = User.first
> task.save

Он сохраняет идентификатор пользователя в поле user_id в таблице tasks.

Без этого столбца ассоциация has_many не будет работать, поскольку нет связи между пользователем и задачей.в базе данных.

Кроме того, в вашем примере миграции правильная связь должна состоять в добавлении has_many :tasks к модели User и belongs_to :user в модели Task.

...