2010-02-15 10 views
0

J'ai 3 tables de données et 2 tables de jointure connectant tout. J'essaie de trouver un moyen d'interroger les résultats en fonction de la condition que les données de la table de jointure sont les mêmes.Rails - Trouver des résultats à partir de deux tables de jointure

Pour expliquer, j'ai des tables d'utilisateurs, d'intérêts et d'événements. Ces tables sont liées par une relation HABTM (ce qui convient bien à mes besoins puisque je n'ai pas besoin de stocker d'autres champs) et jointes via deux tables de jointure. J'ai donc aussi une table UsersInterests avec (user_id, interest_id) et une table EventsInterests avec (event_id, interest_id).

Le problème survient lorsque vous essayez d'interroger tous les événements où les intérêts des utilisateurs correspondent aux intérêts des événements.

je pensais que ce serait ressembler à quelque chose comme ça ...

@events= Event.find(:all, :conditions => [@user.interests = @event.interests]) 

mais j'obtiens l'erreur « méthode non définie pour les intérêts nuls: NilClass », Y at-il quelque chose de mal avec ma syntaxe ou ma logique ?

+0

Pouvez-vous s'il vous plaît montrer la méthode complète pour ce contrôleur d'action? –

Répondre

1

Votre problème est que @user ou @event n'est pas défini. Même si vous les définissez, avant d'exécuter cette instruction, l'option de conditions fournie est invalide, [@user.interests = @event.interests].

Ce champ le nom figure sur les événements devrait faire l'affaire

class Event < ActiveRecord::Base 
    ... 
    named_scope :shares_interest_with_user, lambda {|user| 
    { :joins => "LEFT JOIN events_interests ei ON ei.event_id = events.id " + 
     "LEFT JOIN users_intersets ui ON ui.interest_id = ei.interest_id", 
     :conditions => ["ui.user_id = ?", user], :group_by => "events.id" 
    } 
end 

@events = Event.shares_interest_with_user(@user) 
+0

donc pour l'appeler dans le contrôleur il ressemblerait à "@ Evénements = Event.shares_interest_with_user" ?? – ChrisWesAllen

+0

La portée nommée fonctionne très bien, merci beaucoup. J'ai un petit problème avec la dernière condition cependant, il ne me permet pas d'utiliser ["ui.user_id =?", Utilisateur], aucune idée pourquoi il lance une erreur? – ChrisWesAllen

+0

Quelle est l'erreur que vous obtenez? – EmFi

0

Compte tenu Event <-> Interest <-> User Interroger tous les événements où les utilisateurs intérêts correspondent aux intérêts des événements (de sorte que le suivant trouvera tous ces événements que l'intérêt de cet événement sont aussi des intérêts d'au moins un utilisateur).

premier essai, la chose la plus simple qui pourrait fonctionner:

@events = [] 
Interest.all.each do |i| 
    i.events.each do |e| 
    @events << e if i.users.any? 
    end 
end 
@events.uniq! 

très inefficace, très gourmand en ressources et cpu intensive. Génère beaucoup de requêtes SQL. Mais fait le travail.

Deuxième tentative devrait intégrer une jointure compliquée, mais plus j'y pense, plus je vois à quel point votre problème est vague. Soyez plus précis.

0

Vous ne savez pas exactement ce que vous essayez de faire. Si vous avez un utilisateur et que vous voulez tous les événements que l'utilisateur a également intérêt alors quelque chose comme:

Event.find(:all, :include => [:events_interests], :conditions => ['events_interests.interest_id in (?)', @user.interests.collect(&:id)]) 

devrait probablement fonctionner.