Ответ 1
После того, как вы установили принадлежность к Кролику и has_many в Clown, вы можете выполнить миграцию с помощью:
add_column :rabbit, :clown_id, :integer
Я хотел бы знать "правильный" способ приблизиться к добавлению связи между двумя существующими классами в 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.
После того, как вы установили принадлежность к Кролику и has_many в Clown, вы можете выполнить миграцию с помощью:
add_column :rabbit, :clown_id, :integer
Если вы используете рельсы (4.0), вы можете использовать:
rails generate migration AddAddressRefToContacts address:references
Как вы можете видеть docs.
Я не уверен, где вы получили эту идею, но нет (и никогда не было) такого синтаксиса, чтобы делать то, что вы хотите, с помощью add_column
. Чтобы получить нужное поведение, вам нужно будет сделать t.refences :clown
, как вы сказали. В фоновом режиме это вызовет: @base.add_column(@table_name, "#{col}_id", :integer, options)
.
Смотрите здесь.
EDIT:
Я думаю, что могу видеть источник твоей путаницы. Вы видели вызов метода t.reference
и предположили, что это тип данных, поскольку существуют такие вызовы, как t.integer
и t.string
, и это типы данных. Это неправильно. Ссылка не является типом данных, это просто имя метода, похожее на t.rename
.