referansları polimorfik yapmak için geçiş nasıl oluşturulur


121

Ürünler tablom var ve bir sütun eklemek istiyorum:

t.references :imageable, :polymorphic => true

Bunu yaparak bunun için geçiş oluşturmaya çalışıyordum:

$ rails generate migration AddImageableToProducts imageable:references:polymorphic

ama belli ki yanlış yapıyorum. Herhangi biri öneride bulunabilir mi? Teşekkürler

Taşımayı oluşturduktan sonra manuel olarak yerleştirmeye çalıştığımda, bunu şöyle yaptım:

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

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

ve hala işe yaramadı


Bir yanıt değil, ancak karışıklığı önlemek için Ürünler bölümünde bu sütunu istediğinizden emin misiniz? Raylar kılavuzunda bir Ürünler örneği bile var ve sütun Pictures guides.rubyonrails.org/… üzerinde.
atomkirk

Yanıtlar:


109

Bildiğim kadarıyla, polimorfik çağrışımlar için yerleşik bir jeneratör yok. Boş bir geçiş oluşturun ve ardından ihtiyaçlarınıza göre elle değiştirin.

Güncelleme : Hangi tabloyu değiştirdiğinizi belirtmeniz gerekir. Göre bu SO cevap :

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

Çok teşekkür ederim Brandon. Taşımayı gerçekleştirebildim. Merak ediyordum da, yaptıktan sonra: polimorfik => true ve schema.rb'yi açtığınızda onu şemada da görmeniz gerekiyor mu?
railslearner

Taşımayı çalıştırdıktan sonra schema.rbgüncellenmelidir, ancak bu konuda hiçbir şey söylemeyecektir polymorphic. Bunun yerine, Rails'in kullandığı gerçek alanları görmelisiniz ( Rails Kılavuzlarında daha fazla bilgi vardır).
Michelle Tilley

2
referencesSütuna nasıl indeks eklersiniz ? Bunu indekslemem gerekiyor mu?
mrudult

@mrudult Yanılmıyorsam, ihtiyacınız olursa kendiniz eklemelisiniz. Gerektiğinde imageable_typeve / veya taşıma dosyasında normal olarak dizin ekleyebilirsiniz imageable_id.
Michelle Tilley

2
Evet. dizin ekleniyor imageable_idve imageable_typeçalıştı. Yardımınız için teşekkürler.
mrudult

266

Yapmaya çalıştığınız şey henüz rayların kararlı sürümünde uygulanmadı, bu nedenle Michelle'in cevabı şimdilik doğru cevap. Ancak bu özellik raylar 4'te uygulanacaktır ve aşağıdaki gibi kenar sürümünde zaten mevcuttur (bu CHANGELOG'a göre ):

$ rails generate migration AddImageableToProducts imageable:references{polymorphic}

1
Bunu 4.2'de denedim ve bunun bir bug, zsh veya başka bir şey olup olmadığından emin değilim, ancak komut satırı her polimorfik harfle bir dizi referans (tür olarak) olarak yorumlandı, örneğin: t.referencesp: hayal edilebilir , treferenceso: hayal edilebilir, vb.
OzBarry

10
@OzBarry, zsh'de küme parantezlerinden kaçmanız gerekir: $ rails migration oluşturur AddImageableToProducts imageable: reference \ {polymorphic \}
chad_

4
Merak add_reference :products, :imageable, polymorphic: true, index: true
edenler için

1
İskelede aynısını kullanmaya çalışan biri olursa, bu iskele ile de çalışır. Teşekkürler! rijks
sghosh968

2
{polymorphic}balık kabuğuyla kaçması gerekiyor, örneğin\{polymorphic\}
Dorian

36

Ayrıca şunları da yapabilirsiniz:

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

16

Deneyebilirsin rails generate migration AddImageableToProducts imageable:references{polymorphic}


3
{ve }en azından balık kabuğuyla kaçması gerekir, örneğin\{polymorphic\}
Dorian


Teşekkürler Giovanni, bu çok faydalı.
hutusi
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.