2010-07-09 4 views
1

J'utilise Ruby on Rails et paths_of_glory gemméthode de type interférer avec le problème de colonne de type base de données

J'ai besoin d'accéder aux types de réalisations qu'un utilisateur accomplit afin d'afficher une image avec chaque réalisation particulière. Lorsque j'essaie d'y accéder via @user.achievements.type, j'obtiens une erreur qui indique qu'il veut retourner "array" (comme dans achievements est un tableau) au lieu de renvoyer les éléments dans la colonne type de ma base de données.

Étant donné que chaque objet ruby ​​a une méthode appelée type, mon appel pour accéder à la colonne type de la base de données échoue. Lorsque j'essaie de modifier l'entrée dans le tableau, la gemme paths_of_glory dit qu'il a besoin d'une colonne de type pour fonctionner correctement.

Je ne sais pas trop où aller pour accéder à cette colonne dans la base de données. Aucune suggestion?

+0

ty pour l'édition. – jfedick

Répondre

3

Pas tout à fait sûr de ce que vous demandez ici, mais peut-être que cela vous aidera. Pour la première chose, @user.achievements est un tableau parce que vous avez plusieurs réalisations, et la méthode de type est pour les éléments individuels de @user.achievements, c'est pourquoi cela ne fonctionnera pas comme ça. Vous aurez à faire quelque chose comme ceci:

@user.achievements.each do |achievement| 
    # Do stuff here 
end 

En ce qui concerne la colonne, le type type est une colonne réservée dans Rails utilisé spécifiquement pour unique Héritage de Table, où plusieurs modèles Rails utilisent une table de base de données unique. Vous ne pouvez donc pas y accéder directement. Je suppose que paths_of_glory utilise STI d'une certaine manière. Vous pouvez accéder à la classe du modèle avec quelque chose comme achievement.class, puis si vous voulez juste le nom de celui-ci, vous pouvez essayer achievement.class.to_s.

@user.achievements.each do |achievement| 
    model = achievement.class # => MyAwesomeAchievementClass 
    @image = model.picture # You could write some method in the model like this 
end 
+0

+1 Cela semble être le cas. Si vous voulez le type de toutes les réalisations alors vous pouvez faire '@ user.achievements.map (&: type)' qui retournera un tableau contenant les types de réalisations des utilisateurs ou '@ user.achievements.first.type' pour obtenir le type de la première réalisation pour l'utilisateur. –

+0

Lorsque j'essaie d'exécuter @ user.achievements.each do | achievement |, cela me donne l'erreur: Le mécanisme d'héritage de table unique n'a pas réussi à localiser la sous-classe. Cette erreur est déclenchée car la colonne 'type' est réservée pour stocker la classe en cas d'héritage. Renommez cette colonne si vous n'avez pas l'intention de l'utiliser pour stocker la classe d'héritage ou remplacez Achievement.inheritance_column pour utiliser une autre colonne pour cette information. – jfedick

+0

Avez-vous essayé de faire quelque chose à l'intérieur du bloc ou est-ce une erreur sur cette ligne? – Karl

Questions connexes