6
votes

Rails - Recherchez des enregistrements qui ne présentent pas une autre table de jointure

J'essaie d'écrire une déclaration ActiveCord sur laquelle je cherche tous les enregistrements où l'identifiant n'est pas présent dans une autre table ...

Quelle est la syntaxe? P>

 @events =  Event.find(:all, :include => :personals, 
                  :conditions => ["event.id != ? ", @user.personal.event_id ])


2 commentaires

Obtenez-vous une erreur spécifique ou juste curieux si c'est la voie la plus efficace?


Une meilleure réponse peut être fournie si comment se déroulent les relations?


4 Réponses :


8
votes

Je suppose que les relations sont les suivantes:

Event.find(:all, :conditions => ["events.id NOT IN (?)", @user.event_ids])


1 commentaires

Cela ne générera pas deux commandes SQL - une qui collecte? @ user.event_ids , et celui qui fait pas dans [tous ces identifiants] .. qui convient parfaitement pour de nombreux cas, mais s'il y a des centaines de milliers de @ user.event_ids , alors quelque chose qui génère un SQL pur est préféré; à droite?



9
votes

La solution présentée par Nuby est aussi correcte que jamais. Voici la même requête dans une syntaxe moderne, qui peut être utilisée dans des rails 3 et plus:

Event.where.not(id: @user.event_ids)


2 commentaires

Cela générera une instruction massive (presque certainement illégale) sélectionnée dans laquelle les ID sont simplement inclus dans le texte. Vous avez vraiment besoin de quelque chose qui fait une jointure.


@JamesmoOore événement.Où.not (id: @ user.events.select (: id))



14
votes

Les autres réponses ne font pas d'échelle avec des centaines de milliers de dollars ou plus. Voici une solution pure SQL.

rails 5 +: xxx

Cela récupère tous les événements qui n'ont pas de personnel associé.

rails 3+ : xxx


2 commentaires

Je ne pense pas que ce soit correct. J'ai compris qu'il voulait obtenir des entrées s'ils ne contiennent pas un certain identifiant. Cela saura également ceux qui ont juste un identifiant différent (l'identifiant doit être d'une manière ou d'une autre dans la requête)


Merci - tu as raison, j'ai mal interprété la question. Cette réponse "Événement donné a de nombreuses personnes, comment puis-je obtenir tous les événements qui n'ont aucune personne". Je vois maintenant la question: "L'événement donné a de nombreuses personnes et que l'utilisateur a de nombreuses personnes, comment puis-je obtenir tous les événements qui ne partagent aucune personne avec un utilisateur u".



0
votes

meilleur que j'ai jusqu'à présent: xxx

produit SQL: xxx


0 commentaires