Rails 3 миграций: добавление ссылочного столбца? - PullRequest
162 голосов
/ 10 февраля 2011

Если я создаю новую миграцию rails 3 с (например)

rails g migration tester title:tester user:references

, все работает нормально ... однако, если я добавлю столбец с чем-то вроде:

rails g migration add_user_to_tester user:references

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

Ответы [ 10 ]

204 голосов
/ 03 мая 2013

Если вы используете Rails 4.x , теперь вы можете создавать миграции со ссылками, например:

rails generate migration AddUserRefToProducts user:references

, как вы можете видеть на направляющих рельсов

186 голосов
/ 10 февраля 2011

РЕДАКТИРОВАТЬ : Это устаревший ответ, и его нельзя применять для Rails 4.x +

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

Я бы сказал, что преимущество использования ссылок вместо простого целого числа состоит в том, что модель будет предопределена с помощью assign_to, и, поскольку модель уже создана и не будет затронута при переносе чего-либо существующего, цель вроде как потеря .

Так что я бы сделал вот так:

rails g migration add_user_id_to_tester user_id:integer

А затем вручную добавьте принадлежащего пользователя: в модель Tester

102 голосов
/ 05 января 2012

Обратите внимание, что вам, скорее всего, понадобится индекс для этого столбца.

class AddUserReferenceToTester < ActiveRecord::Migration
  def change
    add_column :testers, :user_id, :integer
    add_index  :testers, :user_id
  end
end
50 голосов
/ 30 апреля 2013

С двумя предыдущими шагами, указанными выше, вы все еще пропускаете ограничение внешнего ключа. Это должно работать:

  class AddUserReferenceToTester < ActiveRecord::Migration
      def change
          add_column :testers, :user_id, :integer, references: :users
      end
  end
35 голосов
/ 26 июня 2013

Вы можете использовать ссылки в миграции изменений. Это действительный код Rails 3.2.13:

class AddUserToTester < ActiveRecord::Migration
  def change
    change_table :testers do |t|
      t.references :user, index: true 
    end
  end
  def down
    change_table :testers do |t|
      t.remove :user_id
    end
  end
end

c.f .: http://apidock.com/rails/ActiveRecord/ConnectionAdapters/SchemaStatements/change_table

27 голосов
/ 22 июля 2014

Запуск rails g migration AddUserRefToSponsors user:references создаст следующую миграцию:

def change
  add_reference :sponsors, :user, index: true
end
8 голосов
/ 03 июля 2013

Это поможет:

rails g migration add_user_to_tester user_id:integer:index
8 голосов
/ 03 сентября 2012

При добавлении столбца вы должны сделать этот столбец целым числом и, если возможно, придерживаться соглашений по рельсам.Так что для вашего случая я предполагаю, что у вас уже есть модели Tester и User, а также таблицы Testers и Users.

Чтобы добавить внешний ключ, вам нужно создать целочисленный столбец с именем user_id (соглашение):

add_column :tester, :user_id, :integer

Затем добавьте принадлежащее_ к модели тестера:

class Tester < ActiveRecord::Base
  belongs_to :user
end

И вы также можете добавить индекс для внешнего ключа (это то, что ссылки уже делают для вас):

add_index :tester, :user_id
3 голосов
/ 13 октября 2015

для рельсов 4

Генератор принимает тип столбца в качестве ссылки (также доступен как belongs_to).

Эта миграция создаст столбец user_id и соответствующий индекс:

$ rails g migration AddUserRefToProducts user:references 

генерирует:

class AddUserRefToProducts < ActiveRecord::Migration
  def change
    add_reference :products, :user, index: true
  end
end

http://guides.rubyonrails.org/active_record_migrations.html#creating-a-standalone-migration

для рельсов 3

Помощник называется ссылками (также доступен как belongs_to).

Эта миграция создаст столбец category_id соответствующего типа. Обратите внимание, что вы передаете имя модели, а не имя столбца. Active Record добавляет _id для вас.

change_table :products do |t|
  t.references :category
end

Если у вас есть полиморфные belongs_to ассоциации, то ссылки добавят оба необходимых столбца:

change_table :products do |t|
  t.references :attachment, :polymorphic => {:default => 'Photo'}
end

Добавит столбец attachment_id и строку attachment_type столбец со значением по умолчанию Photo.

http://guides.rubyonrails.org/v3.2.21/migrations.html#creating-a-standalone-migration

3 голосов
/ 29 мая 2013

Вы можете добавить ссылки на вашу модель через командную строку следующим образом:

rails g migration add_column_to_tester user_id:integer

Это создаст файл миграции, например:

class AddColumnToTesters < ActiveRecord::Migration
  def change
    add_column :testers, :user_id, :integer
  end
end

Это прекрасно работает каждый раз, когда яиспользуйте это ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...