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に。
Rabbitでbelongs_toを設定し、Clownでhas_manyを設定したら、次のようにして移行を行うことができます:
add_column :rabbit, :clown_id, :integer
Edge Rails(4.0)を使用している場合:
Rails generate migration AddAddressRefToContacts address:references
docs で確認できるように。
どこでこのアイデアを得たかはわかりませんが、_add_column
_で必要なことを実行するためのそのような構文はありません(今までにない)。希望する動作を得るには、あなたが述べたように_t.refences :clown
_を実行する必要があります。バックグラウンドで、これは@base.add_column(@table_name, "#{col}_id", :integer, options)
を呼び出します。
こちら を参照してください。
編集:
私はあなたの混乱の原因を理解できると思います。 _t.reference
_や_t.integer
_などの呼び出しが存在し、それらがデータ型であるため、メソッド呼び出し_t.string
_をデータ型であると想定しました。それは間違っている。参照はデータ型ではなく、単にメソッドの名前であり、_t.rename
_と同様です。