2015-03-29 4 views
1

Je travaille sur une requête SQL complexe avec rails 4.2.1Enregistrement actif find_by_sql et rspec attendent bloc. Les nouveaux ids sont créés pour aucune raison

Mon schéma est (emplois has_many tâches, tâches minuteries has_many, et une minuterie belongs_to un utilisateur (rôle: correcteur d'épreuves) par l'intermédiaire de la clé de prévisualisation proofreader_id)

Le problème est que lorsque j'appelle la méthode, elle retourne quel est l'email et les attributs corrects de l'utilisateur mais l'identifiant ne correspond pas.

Pour exeample User.proofreader_for_job (emploi) retourne

[#<User id: 178, email: "[email protected]">] 

[email protected] est l'e-mail correcte, mais je ne dispose pas d'un utilisateur dans mon db avec un id de 178.

User.all retourne juste

[#<User id: 12, email: "[email protected]">, 
#<User id: 11, email: "[email protected]">] 

Je remarqué la question dans mes tests rspec, mais il arrive sur les environnements de développement et de test.

Est-ce que quelqu'un a une idée de la raison pour laquelle mes méthodes retournent un utilisateur avec un ID élevé. Est-ce fait par conception, si oui, pourquoi?

Merci.

Répondre

1

Puisque vous faites 'Select *', votre instruction renverra toutes les colonnes pour chacune des tables de l'instruction JOIN. Ainsi, lorsque vous transtypez la sortie de l'instruction SQL en un type d'utilisateur, je pense que la mauvaise colonne 'id' est saisie pour l'identifiant de l'utilisateur (probablement la table des minuteurs ou des tâches).

Essayez spécifiant explicitement les colonnes à retourner comme la déclaration ci-dessous:

User.find_by_sql(
    "SELECT users.id, users.email FROM users 
    INNER JOIN timers 
    ON users.id = timers.proofreader_id 
    INNER JOIN tasks 
    ON tasks.id = timers.task_id 
    WHERE tasks.job_id = #{job.id}") 
end