89 votes

Rails : utiliser une colonne de type sans STI ?

Je veux utiliser une colonne appelée type sans invoquer l'héritage de table unique (STI) - je veux juste type pour être une colonne normale qui contient un String .

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

Avez-vous des idées sur la manière de procéder ?

144voto

Valentin Nemcev Points 2186

Dans Rails 3.1 set_inheritance_column est déprécié, et vous pouvez aussi simplement utiliser nil comme un nom, comme ceci :

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

0 votes

En fait, il semble que cela ait changé en rails 3.2 . Selon apidock : 'Cette méthode est dépréciée ou déplacée vers la dernière version stable. La dernière version existante (v3.1.0) est affichée ici. Merci quand même pour l'astuce !

0 votes

Il a été déprécié en 3.1 et supprimé en 3.2, je crois.

2 votes

@Batkins Le inheritance_column est déplacé (d'où la mention "déprécié ou déplacé"). L'utilisation du paramètre inheritance_column directement est prévue et n'est pas dépréciée.

24voto

mu is too short Points 205090

Vous pouvez remplacer le nom de la colonne STI en utilisant 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 pour rien et envoyez-le à set_inheritance_column .

2 votes

Dois-je créer cette colonne dans ma base de données ?

0 votes

Merci, ça a marché. Un framework ne devrait JAMAIS !!!!! EVER !!!! dicter le nom qu'un champ de table ne peut pas porter. C'est très mauvais pour les ensembles de données hérités.

5 votes

Jon : Rails ne se préoccupe pas vraiment de l'héritage des données ou de l'entente avec les autres, Rails a trop d'attitude pour cela. Vous pouvez le faire se comporter lui-même avec un peu d'effort mais vous finissez toujours par vous battre un peu si vous avez besoin de faire quelque chose que Rails n'a pas prévu (ce qui inclut malheureusement beaucoup de concepts de base de bases de données). Par ailleurs, je suis un hérétique professionnel, donc les autres utilisateurs de Rails m'en voudront certainement de souligner les problèmes idéologiques :)

22voto

rii Points 35

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 l'envie de nommer un type de colonne ou quelque chose_type, c'est de chercher un synonyme de type et de l'utiliser à la place :

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

11voto

Itay Grudev Points 2014

Rails 4.x

J'ai rencontré le problème dans un Rails 4 mais dans Rails 4 le site 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 d'une seule table en surchargeant ActiveRecord 's inheritance_column comme ceci :

class MyModel < ActiveRecord::Base

  private

  def self.inheritance_column
    nil
  end

end

J'espère que cela vous aidera !

1voto

Bill Lipa Points 176

Si vous voulez faire cela pour tous les modèles, vous pouvez le mettre dans un initialisateur.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X