bagaimana menghasilkan migrasi untuk membuat referensi polimorfik


121

Saya memiliki tabel Produk dan ingin menambahkan kolom:

t.references :imageable, :polymorphic => true

Saya mencoba menghasilkan migrasi untuk ini dengan melakukan:

$ rails generate migration AddImageableToProducts imageable:references:polymorphic

tapi saya jelas melakukannya dengan salah. Adakah yang bisa memberi saran? Terima kasih

Ketika saya mencoba memasukkannya secara manual setelah melakukan migrasi, saya melakukannya seperti ini:

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

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

dan masih belum berhasil


Bukan jawaban, tetapi untuk menghindari kebingungan, apakah Anda yakin ingin kolom ini tentang Produk? Panduan rel bahkan memiliki contoh Produk dan kolomnya ada di Panduan gambar.rubyonrails.org/…
atomkirk

Jawaban:


109

Sejauh yang saya tahu, tidak ada generator bawaan untuk asosiasi polimorfik. Hasilkan migrasi kosong dan kemudian ubah dengan tangan sesuai kebutuhan Anda.

Pembaruan : Anda harus menentukan tabel mana yang Anda ubah. Menurut jawaban SO ini :

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

Terima kasih banyak, Brandon. Saya bisa menjalankan migrasi. Saya bertanya-tanya, setelah Anda membuat: polymorphic => true dan Anda membuka schema.rb, apakah Anda seharusnya melihatnya di skema juga?
railslearner

Setelah Anda menjalankan migrasi, schema.rbharus diperbarui, tetapi tidak akan mengatakan apa-apa polymorphic. Sebagai gantinya, Anda akan melihat bidang sebenarnya yang digunakan Rails ( Panduan Rails memiliki info selengkapnya).
Michelle Tilley

2
Bagaimana Anda menambahkan indeks ke referenceskolom? Apakah saya perlu mengindeksnya?
mrudult

@mrudult Jika saya tidak salah, Anda perlu menambahkannya sendiri jika Anda membutuhkannya. Anda bisa menambahkan indeks seperti biasa di file migrasi ke imageable_typedan / atau imageable_idseperlunya.
Michelle Tilley

2
Ya. menambahkan indeks ke imageable_iddan imageable_typebekerja. Terima kasih atas bantuan Anda.
mrudult

266

Apa yang Anda coba lakukan belum diimplementasikan dalam versi rel yang stabil jadi jawaban Michelle adalah yang tepat untuk saat ini. Tetapi fitur ini akan diimplementasikan di rails 4 dan sudah tersedia di versi edge sebagai berikut (menurut CHANGELOG ini ):

$ rails generate migration AddImageableToProducts imageable:references{polymorphic}

1
Mencoba ini di 4.2, dan saya tidak yakin apakah ini bug, zsh, atau yang lainnya, tetapi baris perintah telah diinterpretasikan sebagai rangkaian referensi (sebagai tipe) dengan setiap huruf polimorfik, seperti: t.referencesp: imagable , treferenceso: imagable, dll.
OzBarry

10
@OzBarry, di zsh Anda harus keluar dari kurung kurawal: $ rails menghasilkan migrasi AddImageableToProducts imageable: reference \ {polymorphic \}
chad_

4
Bagi siapa pun yang penasaran, ini menghasilkan migrasi dengan metode perubahan yang berisi:add_reference :products, :imageable, polymorphic: true, index: true
stevenspiel

1
Jika ada orang yang mencoba menggunakan hal yang sama di perancah, ini juga berfungsi dengan perancah. Terima kasih! rijks
sghosh968

2
{polymorphic}perlu melarikan diri dengan cangkang ikan, misalnya\{polymorphic\}
Dorian

36

Anda juga bisa melakukan hal berikut:

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.