2010-03-27 11 views
0

J'ai la configuration de modèle suivante - un utilisateur est intéressé par des projets dans de nombreuses catégories de projet . Chaque projet a plusieurs catégories. Comme si:rails enregistrement actif - Recherche avancée

class User 
    has_many :projects 
    has_and_belongs_to_many :project_categories 

class Project 
    belongs_to :user 
    has_and_belongs_to_many :project_categories 

class ProjectCategory 
    has_and_belongs_to_many :projects 
    has_and_belongs_to_many :users 

Maintenant, je voudrais faire une trouvaille pour des projets avec l'une des catogories que certains utilisateurs sont intéressés, à savoir si un utilisateur est intéressé par catégories de projets A, B, C alors je voudrais trouver des projets qui font partie d'une ou plusieurs de ces catégories de projets.

Quelqu'un?

Répondre

0

Merci pour votre aide! Étant un noob beaucoup trop enthousiaste pour le moment je n'ai pas parcouru toutes les solutions AR possibles, mais il serait intéressant si quelque chose comme ça freine les abstractions AR comme Pierre l'a dit. Je suis allé avec une version modifiée de la suggestion de Randy:

pids = Project.find_by_sql ["SELECT project_id FROM project_categories_projects JOIN project_categories_users ON project_categories_projects.project_category_id = project_categories_users.project_category_id WHERE user_id = ?", current_user.id] 
mytags_projects = Project.find(pids.collect(&:project_id), :limit => 10, :order => "created_at DESC") 
0

Je crois que c'est une autre instance où l'abstraction ActiveRecord fuit. Vous aurez probablement besoin de SQL pour le faire.

1

D'abord, je rechercherais tous les ID de projet pour un ID utilisateur donné en utilisant un JOIN.

# This will give me the list of project ids for the categories that a user is interested in. 
project_ids = Project.find("SELECT project_id FROM projects_project_categories JOIN project_categories_users ON project_categories_users.project_category_id = projects_project_categories.project_category_id WHERE project_categories_users.user_id = ?", user_id) 

# Now that I have the list of ids I can do a simple primary key lookup. Each project object returned only has the project_id attribute populated since we only asked for the project_id above. 
projects = Project.find(project_ids.collect(&:project_id)) 

Je pense que c'est le moins grand nombre de requêtes que vous pouvez le faire.

qui précède suppose que vos tables de jointure sont appelés projects_project_categories et project_categories_users. Notez également que je n'ai pas testé cela.

+0

Je devrais faire quelques lectures je suppose. Erreur sortie de mon test de console ci-dessous (494281354 est l'ID de l'utilisateur). --- SELECT * FROM 'projets' O WH (' projects'.'id' IN (0,494281354)) ActiveRecord :: RecordNotFound: Impossible de trouver tous les projets avec ID (0,494281354) (trouvé 0 résultats , mais je cherchais 2) – par

+0

Je vois que j'ai eu une faute de frappe dans le code ci-dessus où nous recherchons les projets après avoir obtenu la liste des ID. Je l'ai réparé si vous voulez essayer encore et laissez-moi savoir comment ça se passe. –

1

Vous n'avez pas besoin de SQL pour ce faire, vous pouvez utiliser la fonction bult-in de AR: include.

Ici, nous incluons les associés: utilisateur et:. Project_category, en passant la user_id spécifique et un éventail de catégories qui nous intéressent

project = Project.find(:include => [:user, :project_categories], :conditions => {:user_id => user_id, :project_category_id => [A,B,C,D]}) 

Vous devrez régler les noms de colonnes à vos besoins, mais vous devriez être capable de commencer avec quelque chose comme ça.

+0

Ceci est vrai mais l'inconvénient est qu'il en résulte 3 requêtes SQL. En outre, je ne suis pas sûr s'il a la liste des catégories à l'avance ou si elles viennent du modèle d'utilisateur qui exigerait une requête supplémentaire. –

+0

Vrai, la liste des catégories est associée à l'utilisateur, ce qui serait 'current_user.project_categories' – par

+0

Désolé d'être un noob, mais avec spécifique user_id vérifié et A, B, C, D cela me donne un 'ActiveRecord :: RecordNotFound: Impossible de trouver le projet sans une erreur d'identification. Je dois lire sur comprend d'abord je suppose. – par

Questions connexes