Добавление миграции ссылочного столбца в Rails 4


пользователь имеет много загрузок. Я хочу добавить столбец в uploads таблицы, которая ссылается на user. Как должна выглядеть миграция?

вот что у меня есть. Я не уверен, если я должен использовать (1) :user_id, :int или (2) :user, :references. Я даже не уверен, что (2) работает. Просто пытаюсь сделать это "рельсовым" способом.

class AddUserToUploads < ActiveRecord::Migration
  def change
    add_column :uploads, :user_id, :integer
  end
end

соответствующий вопрос, за исключением рельсов 3. Rails 3 миграции: добавление ссылочного столбца?

5 244

5 ответов:

рельсы 4.x

когда вы уже естьusers и uploads таблицы и хотите добавить новые отношения между ними.

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

rails g migration AddUserToUploads user:references

который создаст файл миграции как:

class AddUserToUploads < ActiveRecord::Migration
  def change
    add_reference :uploads, :user, index: true
  end
end

затем запустите миграцию с помощью rake db:migrate. Эта миграция позаботится о добавлении нового столбца с именем user_id to uploads таблица (ссылка на uploads таблица. Ключ ссылается на

рельсы 5

вы все еще можете использовать эту команду для создания миграции:

rails g migration AddUserToUploads user:references

миграция выглядит немного иначе, чем раньше, но все еще работает:

class AddUserToUploads < ActiveRecord::Migration[5.0]
  def change
    add_reference :uploads, :user, foreign_key: true
  end
end

обратите внимание, что это :user, а не :user_id

Если вам нравится другой альтернативный подход с up и down способ попробовать это:

  def up
    change_table :uploads do |t|
      t.references :user, index: true
    end
  end

  def down
    change_table :uploads do |t|
      t.remove_references :user, index: true
    end
  end

[Используя Рельсы 5]

генерировать миграции:

rails generate migration add_user_reference_to_uploads user:references

это создаст файл миграции:

class AddUserReferenceToUploads < ActiveRecord::Migration[5.1]
  def change
    add_reference :uploads, :user, foreign_key: true
  end
end

теперь, если вы наблюдаете файл схемы, вы увидите, что таблица uploads содержит новое поле. Что-то вроде: t.bigint "user_id" или t.integer "user_id".

перенос базы данных:

rails db:migrate

другой синтаксис делает то же самое:

rails g migration AddUserToUpload user:belongs_to