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?
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
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
.
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.
Rails 4.x
J'ai rencontré le problème dans unRails 4
app, 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!
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