2009-11-26 3 views
0

J'ai les modèles suivants:un many-assoc beaucoup trouvent des conditions

project.rb

has_many :tasks 

task.rb

belongs_to :project 
has_many :assignments 
has_many :users, :through => :assignments 

utilisateur . rb

has_many :assignments 
has_many :tasks, :through => :assignments 

assignment.rb

belongs_to :task 
belongs_to :user 

Ainsi, par exemple: Project.first.title # => "Manhattan" Project.first.tasks.map (&: nom) # => ["Trouver des scientifiques", "Trouver de l'argent", "Trouver un emplacement"] Project.first.tasks.first.users.map (&: full_name) # => ["James Maxwell", "Evariste Galois", "Jules Verne" ']

Ma première question est: Comment puis-je trouver tous les noms des personnes peut-être avec le symbole de proc en un seul coup, j'ai essayé:

Project.first.tasks.users.full_name #=> AND FAILED Project.first.tasks.map(&:users).full_name #=> AND FAILED Project.first.tasks.map(&:users).map(&:full_name) #=> AND FAILED

Toutes les idées?

Et je pense que cette question suivante pourrait être dans le même parc de balle:

Comment puis-je faire une découverte du projet avec les conditions qui recherche l'attribut « full_name » des utilisateurs de ses tâches?

Exemple

Project.all(:include => {:tasks => :users}, :conditions => ['tasks.users.full_name LIKE ?', query]) #this failed

Je pense que le problème est à la 'tasks.users'.

Merci à tous, bonne action de grâce!

Répondre

0

Pour le premier, vous aurez envie de faire quelque chose comme ceci:

Project.first.tasks.map { |t| t.users.map(&:full_name) }.flatten 

La raison est que vous voulez parcourir toutes les tâches, puis tous les utilisateurs de chaque tâche. Sans l'aplatir cela vous donnerait un tableau bidimensionnel.

Et pour la seconde devrait être votre découverte:

Project.all(:include => {:tasks => :users}, :conditions => ['users.full_name LIKE ?', query]) 

écriture users.full_name implique au moteur SQL que vous êtes à la recherche pour le champ full_name sur la table users.

+0

Oh je vois, donc je n'ai pas vraiment à faire : conditions => ['tasks.users.full_name Like?', query] car l'inclusion des utilisateurs permet 1) aux utilisateurs d'être utilisés en mode autonome et 2) d'être correctement ciblés sur les tâches lorsqu'ils sont interrogés. La recherche de tous les noms complets des utilisateurs des tâches d'un projet fonctionne! - Y a-t-il une préférence informatique/mathématique pour expliquer pourquoi nous pouvons enchaîner les associations plusieurs-à-plusieurs pour obtenir des attributs «grand-totaux»? J'aime Project.first.tasks.users.map (&: full_name) Je peux imaginer des scénarios où les gens ont besoin de ce Merci Radar. Plz considère cas fermé. Joyeuses fêtes! –

Questions connexes