Подтвердить что ты не робот

Добавление ссылки модели на существующую модель Rails

Я хотел бы знать "правильный" способ приблизиться к добавлению связи между двумя существующими классами в Rails 3.

Учитывая существующие модели: Clown and Rabbit

Я хочу добавить ссылку (принадлежит_от) от Кролика к Клоуну. Сначала я попытаюсь создать миграцию:

rails g migration AddClownToRabbits clown:reference

который дает мне миграцию, которая выглядит так:

class AddClownToRabbits < ActiveRecord::Migration
  def self.up
    add_column :rabbits, :clown, :reference
  end

  def self.down
    remove_column :rabbits, :clown
  end
end

После rake db:migrate в этой миграции я рассмотрю SQLite3 development.db и увижу новый столбец: "clown" reference

Я предполагаю, что ожидал столбец "clown_id" integer и миграцию, которая выглядела так:

class AddClownToRabbits < ActiveRecord::Migration
  def self.up
    add_column :rabbits, :clown_id
  end

  def self.down
    remove_column :rabbits, :clown_id
  end
end

Я уверен: ссылка должна быть эквивалентна "t.references: clown", но я не могу найти документацию (большой сюрприз). API говорит add_column: Instantiates a new column for the table. The type parameter is normally one of the migrations native types, which is one of the following: :primary_key, :string, :text, :integer, :float, :decimal, :datetime, :timestamp, :time, :date, :binary, :boolean.

... без ссылки на: reference.

4b9b3361

Ответ 1

После того, как вы установили принадлежность к Кролику и has_many в Clown, вы можете выполнить миграцию с помощью:

add_column :rabbit, :clown_id, :integer

Ответ 2

Если вы используете рельсы (4.0), вы можете использовать:

rails generate migration AddAddressRefToContacts address:references

Как вы можете видеть docs.

Ответ 3

Я не уверен, где вы получили эту идею, но нет (и никогда не было) такого синтаксиса, чтобы делать то, что вы хотите, с помощью add_column. Чтобы получить нужное поведение, вам нужно будет сделать t.refences :clown, как вы сказали. В фоновом режиме это вызовет: @base.add_column(@table_name, "#{col}_id", :integer, options).

Смотрите здесь.

EDIT:

Я думаю, что могу видеть источник твоей путаницы. Вы видели вызов метода t.reference и предположили, что это тип данных, поскольку существуют такие вызовы, как t.integer и t.string, и это типы данных. Это неправильно. Ссылка не является типом данных, это просто имя метода, похожее на t.rename.