2013-08-14 13 views
16

Pracuję więc nad migracją tej witryny php z istniejącą bazą danych, której nie mogę zmienić na Railsy. Jest tabela: Quotes z kolumną o nazwie type. Ilekroć próbuję i stworzyć model to i ustawić typ, mówi mi następujący błąd:Szyny: błąd nieprawidłowego typu dziedziczenia pojedynczego zbioru

ActiveRecord::SubclassNotFound (Invalid single-table inheritance type: HOME is not a subclass of Quotes)

Nie rozumiem, dlaczego uważa jego dziedziczenie, ponieważ nie miało. Moja metoda tworzenia wygląda następująco:

quote = Quotes.create(
    agent_id: agent.id, 
    client_id: client.id, 
    type: 'HOME', 
    status: 0, 
    date_created: DateTime.now 
) 

Jeśli skomentuję typ, wszystko działa poprawnie. Ale z błędami typu.

Odpowiedz

49

Rozwiązałem to, ustawiając kolumny dziedziczenia modeli na zero. Record aktywne modele mogą dziedziczyć z tabeli za pomocą atrybutu :type, ustawienie inheritance_column do zera usuwa ten atrybut pozwalający, aby mieć kolumnę bazy danych o nazwie type

class Quote < ActiveRecord::Base 
    self.inheritance_column = nil 
end 
+0

Dzięki, ten wskazał mnie we właściwym kierunku. Miałem kolumnę o nazwie "typ" i spowodował błąd. – mack

3

Nienawidzę konieczności potencjalnych gotchas głęboko w kodzie zwłaszcza w intial procesy takie jak generowanie modelu. Lepiej po prostu zmienić zarezerwowane słowo na coś innego i uwolnić się, aby wykorzystać kolumnę dziedziczenia później, jeśli zajdzie taka potrzeba. Czyste rozwiązanie jest wymienione tutaj ->rename a database column name using migration

To czyta;

  1. Execute $> Szyny generować migracji ChangeColumnName gdzie ChangeColumnName jest nazwą naszej migracji. To może być dowolna nazwa.
  2. Teraz edytować wygenerowany plik migracji na db/migrować/_change_column_name.rb

    class ChangeColumnName < ActiveRecord::Migration 
    def change 
    rename_column :table_name, :old_column, :new_column 
    end 
    end 
    
  3. $> rake db: migrować

Będziesz musiał edytować i przeglądać pliki sterownika np Jeśli nazwa modelu jest produktem następnie będzie prawdopodobnie edytować te pliki

  1. /app/views/products/_form.html.erb
  2. /app/views/products/show.html.erb
  3. /app/controllers/products_controller.erb
  4. /app/views/products/index.html.erb
+0

Chociaż zgadzam się, że jest to najlepsza praktyka, mój problem polegał na używaniu starszej bazy danych, w której nie miałem możliwości zmiany rzeczy. –

Powiązane problemy