jak wygenerować migrację, aby uczynić odniesienia polimorficznymi


121

Mam tabelę Produkty i chcę dodać kolumnę:

t.references :imageable, :polymorphic => true

Próbowałem wygenerować migrację w tym celu, wykonując:

$ rails generate migration AddImageableToProducts imageable:references:polymorphic

ale oczywiście robię to źle. Czy ktoś może coś zasugerować? Dzięki

Kiedy próbuję ręcznie wstawić go po wygenerowaniu migracji, zrobiłem to tak:

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

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

i nadal nie działa


Nie jest to odpowiedź, ale aby uniknąć nieporozumień, czy na pewno chcesz tę kolumnę dotyczącą produktów? Przewodnik po szynach ma nawet przykład produktów, a kolumna jest na Zdjęcia guide.rubyonrails.org/…
atomkirk

Odpowiedzi:


109

O ile wiem, nie ma wbudowanego generatora skojarzeń polimorficznych. Wygeneruj pustą migrację, a następnie zmodyfikuj ją ręcznie zgodnie ze swoimi potrzebami.

Aktualizacja : musisz określić, którą tabelę zmieniasz. Zgodnie z tą odpowiedzią 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

Bardzo dziękuję Brandon. Udało mi się przeprowadzić migrację. Zastanawiałem się jednak, czy po utworzeniu: polymorphic => true i otwarciu schema.rb masz to również zobaczyć w schemacie?
railslearner

Po uruchomieniu migracji schema.rbpowinien zostać zaktualizowany, ale nie będzie o nim nic mówić polymorphic. Zamiast tego powinieneś zobaczyć rzeczywiste pola używane przez Railsy ( więcej informacji znajdziesz w Przewodniku po Railsach ).
Michelle Tilley

2
Jak dodać indeks do referenceskolumny? Czy muszę to indeksować?
mrudult

@mrudult Jeśli się nie mylę, musisz je dodać samodzielnie, jeśli ich potrzebujesz. Możesz po prostu dodać indeksy w normalny sposób w pliku migracji do imageable_typei / lub imageable_idw razie potrzeby.
Michelle Tilley

2
Tak. dodanie indeksu do imageable_idi imageable_typedziałało. Dzięki za pomoc.
mrudult

266

To, co próbujesz zrobić, nie zostało jeszcze zaimplementowane w stabilnej wersji railsów, więc odpowiedź Michelle jest na razie właściwa. Ale ta funkcja zostanie zaimplementowana w szynach 4 i jest już dostępna w wersji krawędziowej w następujący sposób (zgodnie z tym CHANGELOG ):

$ rails generate migration AddImageableToProducts imageable:references{polymorphic}

1
Wypróbowałem to w 4.2 i nie jestem pewien, czy to błąd, zsh, czy coś innego, ale linia poleceń została zinterpretowana jako seria odniesień (jako typy) z każdą literą polimorficzną, na przykład: t.referencesp: imagable , treferenceso: imagable, etc.
OzBarry

10
@OzBarry, w zsh musiałbyś uciec z nawiasów klamrowych: $ rails generuje migrację AddImageableToProducts imageable: referencje \ {polymorphic \}
chad_

4
Dla każdego, kto jest ciekawy, generuje migrację z metodą zmiany zawierającą:add_reference :products, :imageable, polymorphic: true, index: true
stevenspiel

1
Niech każdy, kto próbuje użyć tego samego w rusztowaniu, działa również z rusztowaniem. Dzięki! rijks
sghosh968

2
{polymorphic}trzeba uciec ze skorupą ryby, np.\{polymorphic\}
Dorian

36

Możesz też wykonać następujące czynności:

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.