Rails 3 миграции: добавление ссылочного столбца?

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

rails g migration tester title:tester user:references

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

rails g migration add_user_to_tester user:references

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

10 ответов


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

rails generate migration AddUserRefToProducts user:references

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


редактировать: это устаревший ответ и не должна применяться для рельсы 4.x+

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

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

поэтому я бы сделал это вместо этого:

rails g migration add_user_id_to_tester user_id:integer

а затем вручную добавьте belongs_to: user в модель тестера


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

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

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

  class AddUserReferenceToTester < ActiveRecord::Migration
      def change
          add_column :testers, :user_id, :integer, references: :users
      end
  end

вы can Используйте ссылки в миграции изменений. Это действительный код 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


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

def change
  add_reference :sponsors, :user, index: true
end

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

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

add_column :tester, :user_id, :integer

затем добавьте belongs_to в модель тестера:

class Tester < ActiveRecord::Base
  belongs_to :user
end

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

add_index :tester, :user_id

это сделает трюк:

rails g migration add_user_to_tester user_id:integer:index

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

rails g migration add_column_to_tester user_id:integer

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

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

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


Для Рельсов 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 столбец соответствующего типа. Обратите внимание, что вы передаете имя модели, а не имя столбца. Активная запись добавляет _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