ruby on rails - таблицы - has_many, belongs_to отношение в активных рельсах миграции записей 4




полиморфные ассоциации rails (4)

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

rails g scaffold child parent:references

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

Если вы действительно не определили в модели / db много детства. Лучше всего было бы запустить rails destroy scaffold child , а затем запустить rails g scaffold child parent:references на него. Не забудьте добавить строку drop_table :children if table_exists? :children 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 has_[one | many] :children , а belongs_to :parent модель belongs_to :parent .

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

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

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

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

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

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

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


Вы могли бы позвонить:

rails g model task user:references

который будет генерировать столбец user_id в таблице tasks и будет модифицировать модель task.rb чтобы добавить rel_onship. Обратите внимание, что вы должны вручную вручную установить 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 не будет создано автоматически, поэтому вы должны создать его самостоятельно.


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

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

class User < ActiveRecord::Base
  has_many :tasks
end

class Task < ActiveRecord::Base
  belongs_to :user
end

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

Взгляните на это руководство


Связь в Rails берется по модели не Rails.

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

class User < ActiveRecord::Base
  has_many :tasks
end

class Task < ActiveRecord::Base
  belongs_to :user
end

И просто убедитесь, что поле user_id присутствует в миграции для создания таблицы «tasks».





rails-migrations