Has_many, belongs_to отношение в активных рельсах миграции записей 4
Я создал модель User
, а затем модель Task
. Я не упоминал о какой-либо связи между ними при создании.
Я понимаю, что User
has_many
Tasks
и a Task
belongs_to
User
. Мне нужно установить эту связь между ними через миграцию.
Мой вопрос в том, какова была бы команда генерации миграции для установления этого отношения?
Любая помощь будет высоко оценена.
Ответы
Ответ 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.