2010-07-27 6 views
4

Pour définir la scène, je suis en utilisant des rails 3 et j'ai ces tables et les relations:ActiveRecord :: Relation jointe, comment ajouter une colonne d'une table de jointure au résultat de la requête avec un nouveau nom?

user has_many lists 
list has_many tasks 
task has_many stints 

Je voudrais construire une requête qui me permet de sélectionner tous les relais actuels des utilisateurs, et d'avoir le list.id disponible en tant qu'attribut sur chaque relais dans le résultat. Je devrais renommer list.id en list_id car sinon il écrase l'attribut id du stint dans le résultat. Je pensais que "comme" fonctionnerait, mais ce n'est pas le cas.

Cela me donne le dernier relais appartenant à l'utilisateur 1:

Stint.joins(:task => [{:list => :user }]).where(:lists => {:user_id => 1 }).last 
=> #<Stint id: 753, task_id: 245> 

Ce que je voudrais cependant, est la suivante:

=> #<Stint id: 753, task_id: 245, list_id: 2> 

donc je pensais cela fonctionnerait:

Stint.joins(:task => [{:list => :user }]).where(:lists => {:user_id => 1 }).select('stints.*, lists.id as list_id').last 
=> #<Stint id: 753, task_id: 245> 

Comme vous pouvez le voir, pas de différence. Mais si je ne l'utilise « comme », je reçois ceci:

Stint.joins(:task => [{:list => :user }]).where(:lists => {:user_id => 1 }).select('stints.*, lists.id').last 
=> #<Stint id: 2, task_id: 245> 

Le list.id est utilisé, mais parce que l'attribut est défini avec le nom « id » il cache le stint.id.

Toute aide serait appréciée.

EDIT - Le code SQL est correct. La requête renvoie les colonnes et les valeurs correctes, y compris list_id.
Le problème est qu'il ne crée pas d'attribut sur le modèle.

Répondre

5

duh - résolu. L'attribut était là tout le temps. Ce n'était juste pas affiché dans le résultat. Comme je me sens bête ..

s = Stint.joins(:task => [{:list => :user }]).where(:lists => {:user_id => 1 }).select('stints.*, lists.id as list_id').last 
=> #<Stint id: 753, task_id: 245> 

s.attributes 
=> {"id"=>753, "list_id"=>"2", "task_id"=>245} 

s.list_id 
=> "2" 
Questions connexes