参照をポリモーフィックにするマイグレーションを生成する方法


121

Productsテーブルがあり、列を追加したい:

t.references :imageable, :polymorphic => true

私はこれを行うためにこのための移行を生成しようとしていました:

$ rails generate migration AddImageableToProducts imageable:references:polymorphic

しかし、私は明らかにそれを間違っています。誰かが何か提案をすることはできますか?ありがとう

マイグレーションの生成後に手動で挿入しようとすると、次のようになりました。

class AddImageableToProducts < ActiveRecord::Migration
  def self.up
    add_column :products, :imageable, :references, :polymorphic => true
  end

  def self.down
    remove_column :products, :imageable
  end
end

そしてそれはまだ機能していません


答えではありませんが、混乱を避けるために、この製品の列を本当によろしいですか?レールガイドにも製品の例があり、コラムは画像ガイドにあります。guides.rubyonrails.org/…
atomkirk

回答:


109

私の知る限り、ポリモーフィックな関連付けのための組み込みのジェネレーターはありません。空のマイグレーションを生成し、必要に応じて手動で変更します。

更新:変更するテーブルを指定する必要があります。このSOの回答によると:

class AddImageableToProducts < ActiveRecord::Migration
  def up
    change_table :products do |t|
      t.references :imageable, polymorphic: true
    end
  end

  def down
    change_table :products do |t|
      t.remove_references :imageable, polymorphic: true
    end
  end
end

ブランドン、どうもありがとうございました。移行を実行することができました。ただし、:polymorphic =>をtrueにしてschema.rbを開いた後、スキーマにも表示されるはずですか?
railslearner

移行を実行した後、schema.rbを更新する必要がありますが、については何も表示されませんpolymorphic。代わりに、Railsが使用する実際のフィールドが表示されます(Railsガイドに詳細があります)。
ミシェルティリー

2
どのようにreferences列にインデックスを追加しますか?それを索引付けする必要がありますか?
mrudult 2014

@mrudult私が間違っていなければ、必要な場合は自分で追加する必要があります。移行ファイルのインデックスを通常どおり、imageable_typeまたはimageable_id必要に応じて追加できます。
ミシェルティリー

2
うん。インデックスを追加しimageable_idimageable_type機能しました。ご協力いただきありがとうございます。
mrudult 2014

266

あなたがしようとしていることはまだ安定版のレールには実装されていないので、ミシェルの答えは今のところ正しいものです。ただし、この機能はrails 4に実装され、次のように(このCHANGELOGに従って)エッジバージョンですでに使用可能です。

$ rails generate migration AddImageableToProducts imageable:references{polymorphic}

1
4.2でこれを試しましたが、これがバグ、zsh、またはその他の何かであるかどうかはわかりませんが、コマンドラインは次のように、ポリモーフィックの各文字を含む一連の参照(タイプとして)として解釈されました:t.referencesp:imagable 、treferenceso:imagableなど
OzBarry

10
@ OzBarry、zshでは中括弧をエスケープする必要があります:$ rails generate migration AddImageableToProducts imageable:references \ {polymorphic \}
chad_

4
好奇心誰のために、これは含む変更方法での移行を生成しますadd_reference :products, :imageable, polymorphic: true, index: true
stevenspiel

1
足場でこれを使用しようとしている人がいる場合、これは足場でも機能します。ありがとう!rijks
sghosh968

2
{polymorphic}魚の殻を使って脱出する必要があります。例\{polymorphic\}
ドリアン

36

次のこともできます。

class AddImageableToProducts < ActiveRecord::Migration
  def change
    add_reference :products, :imageable, polymorphic: true, index: true
  end
end

16

あなたが試すことができます rails generate migration AddImageableToProducts imageable:references{polymorphic}


3
{そして}、少なくとも魚の殻で脱出する必要があります。例えば\{polymorphic\}
ドリアン

1
これに関するドキュメントへのリンクは次のとおり
Giovanni

Giovanniに感謝します。これは非常に便利です。
hutusi 2018年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.