Вот как обычно должна создаваться миграция:
rails g scaffold child parent:references
Я забыл добавить parent:references
при создании таблицы, что мне делать?
Вариант 1. Уничтожить таблицу и начать заново
Если у вас мало что определено в модели / БД о дочерней таблице. Лучше всего просто запустить rails destroy scaffold child
, а затем запустить rails g scaffold child parent:references
поверх него. Обязательно добавьте строку drop_table :children if table_exists? :children
перед созданием таблицы в файле, который создает новую таблицу. (Таким образом, если кто-то возьмет ваш код, он сможет просто запустить миграцию и сделать это.) Однако кажется более вероятным, что у вас уже будут данные, которые вы не хотите потерять в дочерней модели. В этом случае:
Вариант 2. Напишите миграцию для добавления ссылок
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 содержит дополнительную информацию по этому вопросу.
person
0112
schedule
01.10.2014