web-dev-qa-db-de.com

Schienen - Typenspalte ohne STI?

Ich möchte eine Spalte namens type verwenden, ohne Single Table Inheritance (STI) aufzurufen. Ich möchte nur, dass type eine normale Spalte ist, die eine String enthält.

Wie kann ich dies tun, ohne dass Rails erwartet, dass ich eine einzelne Tabellenvererbung habe und eine Ausnahme von The single-table inheritance mechanism failed to locate the subclass...This error is raised because the column 'type' is reserved for storing the class in case of inheritance. auslöst?

Irgendwelche Ideen, wie das geht?

74
Kvass

In Rails 3.1 ist set_inheritance_column veraltet. Sie können auch nil als Namen verwenden:

class Pancakes < ActiveRecord::Base
    self.inheritance_column = nil
    #...
end
122
Valentin Nemcev

Sie können den Namen der STI-Spalte mit set_inheritance_column überschreiben:

class Pancakes < ActiveRecord::Base
    set_inheritance_column 'something_you_will_not_use'
    #...
end

Wählen Sie also einen Spaltennamen aus, den Sie nicht verwenden möchten, und geben Sie diesen an set_inheritance_column weiter.

20
mu is too short

Ich weiß, dass diese Frage ziemlich alt ist und dies ein wenig von der Frage abweicht, die Sie stellen, aber was ich immer mache, wenn ich den Drang verspüre, einen Spaltentyp oder etwas-Typ zu nennen, suche ich nach einem Synonym des Typs und verwende stattdessen:

Hier sind ein paar Alternativen: Art, Sorte, Sorte, Kategorie, Set, Genre, Art, Reihenfolge usw.  

17
rii

Schienen 4.x

Ich bin auf das Problem in einerRails 4app gestoßen, aber in Rails 4 ist die set_inheritance_column-Methode überhaupt nicht vorhanden, so dass Sie es nicht verwenden können.

Die Lösung, die für mich funktionierte, bestand darin, die Vererbung einzelner Tabellen zu deaktivieren, indem die inheritance_column-Methode von ActiveRecord wie folgt überschrieben wurde:

class MyModel < ActiveRecord::Base

  private

  def self.inheritance_column
    nil
  end

end

Ich hoffe es hilft!

8
Itay Grudev

Wenn Sie dies für alle Modelle tun möchten, können Sie dies in einem Initialisierer speichern.

ActiveSupport.on_load(:active_record) do
  class ::ActiveRecord::Base
    # disable STI to allow columns named "type"
    self.inheritance_column = :_type_disabled
  end
end
0
Bill Lipa