web-dev-qa-db-fra.com

Rails - utilisez la colonne de type sans STI?

Je souhaite utiliser une colonne appelée type sans invoquer l'héritage d'une table (STI) - je souhaite simplement que type soit une colonne normale contenant une String.

Comment puis-je faire cela sans que Rails s’attende à ce que j’ai un héritage de table unique et lève une exception de 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.?

Auriez vous des idées pour faire ça?

74
Kvass

Dans Rails 3.1, set_inheritance_column est obsolète, vous pouvez simplement utiliser nil comme nom, comme ceci:

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

Vous pouvez remplacer le nom de la colonne STI à l’aide de set_inheritance_column :

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

Choisissez donc un nom de colonne que vous n’utiliserez plus et transmettez-le à set_inheritance_column.

20
mu is too short

Je sais que cette question est assez ancienne et qu'elle s'écarte un peu de la question que vous posez, mais ce que je fais toujours lorsque je ressens le besoin de nommer un type de colonne ou quelque chose de type est de rechercher un synonyme de type et de l'utiliser à la place

Voici quelques alternatives: type, type, variété, catégorie, ensemble, genre, espèce, ordre, etc.  

17
rii

Rails 4.x

J'ai rencontré le problème dans unRails 4app, mais dans Rails 4 la méthode set_inheritance_column n'existe pas du tout, vous ne pouvez donc pas l'utiliser.

La solution qui a fonctionné pour moi a été de désactiver l’héritage de table unique en surchargeant la méthode ActiveRecord ’s inheritance_column, comme ceci:

class MyModel < ActiveRecord::Base

  private

  def self.inheritance_column
    nil
  end

end

J'espère que ça aide!

8
Itay Grudev

Si vous voulez le faire pour tous les modèles, vous pouvez le coller dans un initialiseur.

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