Naja, das ist halt das Problem. Man kann schwer einem Fehler auf die Spur kommen, wenn man den Code nicht kennt. Normalerweise wird in den Standardklassen nur mit der ID, nicht mit dem eigentlichen Objekt gehandelt. Wenn es in diesem Fall andersherum ist (im obigen Code steht ja tatsächlich skill.id) dann hast du natürlich recht.
Code:
skill_index = user.skills.index(skill.id) || 0