Подтвердить что ты не робот

Has_many, belongs_to отношение в активных рельсах миграции записей 4

Я создал модель User, а затем модель Task. Я не упоминал о какой-либо связи между ними при создании.

Я понимаю, что User has_many Tasks и a Task belongs_to User. Мне нужно установить эту связь между ними через миграцию.

Мой вопрос в том, какова была бы команда генерации миграции для установления этого отношения?

Любая помощь будет высоко оценена.

4b9b3361

Ответ 1

Вы можете позвонить:

rails g model task user:references

который генерирует столбец user_id в таблице tasks и изменит модель task.rb, чтобы добавить relatonship belongs_to :user. Обратите внимание, что вы должны вручную установить отношения has_many :tasks или has_one :task к модели user.rb.

Если у вас уже есть сгенерированная модель, вы можете создать миграцию со следующим:

rails g migration AddUserToTask user:belongs_to

который будет генерировать:

class AddUserToTask < ActiveRecord::Migration
  def change
    add_reference :tasks, :user, index: true
  end
end

Единственное отличие этого подхода состоит в том, что отношение belongs_to :user в модели task.rb не будет создано автоматически, поэтому вы должны создать его для своего собственного.

Ответ 2

Чтобы ответить на вопрос "Какова была бы команда генерации миграции для установления этого отношения?" (значение, как вы добавляете перенос для существующих моделей с такими отношениями, как User has_many Tasks и Task belongs_to User)

Самый легкий способ запомнить:

>rails g migration AddUserToTask user:belongs_to

или

>rails g migration AddUserToTask user:references

:belongs_to - это просто псевдоним :references, поэтому либо сделайте то же самое.

Выполняя это, команда выведет имя таблицы из имени миграции, настроит метод изменения, который добавит столбец для отношения, и настройте его для индексирования:

class AddUserToTask < ActiveRecord::Migration
  def change
    add_reference :tasks, :user, index: true
  end
end

После создания этого вы:

>rake db:migrate

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

Ответ 3

Как это сделать при создании миграции в первую очередь:

rails g scaffold child parent:references


Что делать, если вы забыли бит parent:references:

Если вы действительно не определились в модели /db о ребенке. Лучше всего было бы запустить rails destroy scaffold child, а затем запустить rails g scaffold child parent:references над ним. Обязательно добавьте строку drop_table :children if table_exists? :children перед созданием таблицы в файле, который создает новую таблицу. (Таким образом, если кто-то тянет ваш код, они могут просто запускать миграции и выполняться.) Однако представляется более вероятным, что у вас будут данные, которые вы не хотите потерять в дочерней модели.


В этом случае:

rails g migration add_parent_refs_to_child

## XXXXXXXXXXXXXX_add_parent_refs_to_child.rb
class AddParentRefsToChild < ActiveRecord::Migration
  def change
    add_reference :child, :parent, index: true
  end
end

Подробнее см. add_reference.

Также не забудьте убедиться, что родительская модель has_[one | many] :children и что дочерняя модель belongs_to :parent.


Как это сделать:

У вас может возникнуть соблазн просто войти и добавить parent_id вручную, и вы, конечно, могли бы, это не лучшее решение, поскольку это не обычный способ добавления внешних ключей и не очень хорошо подходит для ремонтопригодность или удобочитаемость. Контракт над конфигурацией!

Руководство по Ruby on Rails для ассоциации также содержит более полезную информацию по этому вопросу.

Ответ 4

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

В вашей модели пользователя вы разместите

class User < ActiveRecord::Base
  has_many :tasks
end

class Task < ActiveRecord::Base
  belongs_to :user
end

В соответствующем файле миграции для задач у вас есть следующее поле user_id

Взгляните на это guide

Ответ 5

Миграция добавит идентификатор пользователя в таблицу задач, чтобы они знали друг о друге

rails g migration AddUserIdToTask user_id:integer

затем

rake db:migrate

И после обновления ваших контроллеров и представлений, чтобы задачи не могли быть созданы самостоятельно, но должны соответствовать пользователю

Ответ 6

Отношения в Rails обрабатываются моделью не по Rails.

Поэтому вам просто нужно определить это соотношение в своей модели:

class User < ActiveRecord::Base
  has_many :tasks
end

class Task < ActiveRecord::Base
  belongs_to :user
end

И только убедитесь, что в процессе миграции в поле "user_id.