Добавление ссылки на модель в существующую модель Rails - PullRequest
27 голосов
/ 02 декабря 2010

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

Учитывая существующие модели: Клоун и Кролик

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

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.

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

Ответы [ 3 ]

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

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

rails generate migration AddAddressRefToContacts address:references

Как вы можете видеть по документам .

19 голосов
/ 02 декабря 2010

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

add_column :rabbit, :clown_id, :integer
5 голосов
/ 02 декабря 2010

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

См. здесь .

РЕДАКТИРОВАТЬ:

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

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