web-dev-qa-db-ja.com

既存のRailsモデルへのモデル参照の追加

Rails 3.の2つの既存クラス間の関係を追加するアプローチの「適切な」方法を知りたいのですが。

既存のモデルを考える:ピエロとウサギ

RabbitからClownへの参照(belongs_to)を追加したいと思います。私はマイグレーションを生成しようとすることから始めます:

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

:referenceは "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を使用せずに:referenceに。

27
Meltemi

Rabbitでbelongs_toを設定し、Clownでhas_manyを設定したら、次のようにして移行を行うことができます:

add_column :rabbit, :clown_id, :integer
19
clemensp

Edge Rails(4.0)を使用している場合:

Rails generate migration AddAddressRefToContacts address:references

docs で確認できるように。

57
Paulo Fidalgo

どこでこのアイデアを得たかはわかりませんが、_add_column_で必要なことを実行するためのそのような構文はありません(今までにない)。希望する動作を得るには、あなたが述べたように_t.refences :clown_を実行する必要があります。バックグラウンドで、これは@base.add_column(@table_name, "#{col}_id", :integer, options)を呼び出します。

こちら を参照してください。

編集:

私はあなたの混乱の原因を理解できると思います。 _t.reference_や_t.integer_などの呼び出しが存在し、それらがデータ型であるため、メソッド呼び出し_t.string_をデータ型であると想定しました。それは間違っている。参照はデータ型ではなく、単にメソッドの名前であり、_t.rename_と同様です。

5
ryeguy