J'ai quelques joueurs et les joueurs ont un état de commerce. Plutôt que d'écrire des codes durs comme "actif" et "inactif", puis de chercher des chaînes, je pensais que je serais intelligent et que je disposerais d'un modèle TradeState séparé pour qu'un joueur ait un trade_state_id (un joueur ne peut être qu'en un état de commerce à la fois). Maintenant, il serait pratique de pouvoir obtenir tous les joueurs actifs en utilisant des portées nommées, puis en disant "Player.active". Pour ce faire, je dois obtenir l'ID des enregistrements TradeState qui correspond « actif », donc je suis venu avec cela dans la classe du joueur:Rspec, ordre de chargement du modèle, les montages et le défi named_scope
named_scope :active, :conditions => {:trade_state_id => TradeState.active.first.id}
Cela fonctionne comme un charme lorsqu'il est testé dans le script/console, mais ça ne marche pas quand je vais tester. J'utilise RSpec, mais je suppose que ce n'est pas pertinent. Quand je lance le test le plus trivial, je reçois l'erreur suivante:
« appelé id pour nul, ce qui serait par erreur de 4 »
Pour autant que je peux dire, le cadre d'essais chargement et l'analyse des modèles par ordre alphabétique. Le framework analyse l'appel named_scope dans le modèle Player et va consciencieusement rechercher l'identifiant du premier enregistrement TradeState actif. Cependant, ce modèle n'a pas encore été traité et n'est pas prêt, d'où l'erreur concernant l'obtention de l'ID de zéro. Au début, je pensais que c'était parce qu'il n'y avait pas d'enregistrements dans la table trade_states, donc je crée et enregistre les trade_states dont j'avais besoin dans le bloc before (: each), mais cela n'a pas fonctionné. Alors j'ai fait quelques montages et j'ai essayé de les charger, mais ça n'a pas marché.
Est-ce que cela semble plausible? Y a-t-il d'autres explications? Que diriez-vous de travailler autour? Je pourrais essayer de se moquer de l'objet TradeState et je vais essayer.
Merci beaucoup pour votre temps.
Je dirais, "oui", il est plausible qu'il n'y a rien dans votre base de données, par conséquent, appeler "id" sur nil (retourné par TradeState.active.first) lancerait une erreur. Je ne peux pas dire pourquoi votre table est vide parce que vous dites seulement "ça n'a pas marché" sans code. –