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

railslearner
źródło
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
Michelle Tilley
źródło
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}
simon-olivier
źródło
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
freddyrangel
źródło
16

Możesz spróbować rails generate migration AddImageableToProducts imageable:references{polymorphic}

hutusi
źródło
3
{i }trzeba uciec przynajmniej ze skorupą ryby, np.\{polymorphic\}
Dorian
1
Oto link do dokumentacji na ten temat: edgeguides.rubyonrails.org/…
Giovanni Benussi
Dzięki Giovanni, to jest bardzo przydatne.
hutusi