2011-01-06 4 views
2

Hey ich hoffe, dass Sie mir helfen können,wie sagt man 'nicht in' in einem aktiven Datensatz Abfrage

@courses = Course.where (: id = current_user.courses)

Ich möchte Holen Sie sich die Kurse, wo der aktuelle Benutzer nicht registriert ist

@courses = Course.where (: id => current_user.courses) gibt mir die Kurse, wo der Benutzer registriert hat. Aber ich will das Gegenteil

Associations sind ganz in Ordnung. Ich kann current_user.courses oder current_user.assignments verwenden.

Antwort

6

Sie müssen wahrscheinlich so etwas wie diese:

@courses = Course.where("id NOT IN (?)", current_user.courses) 

Der Grund, warum Sie nicht eine reine Array oder Hash-Zustand verwenden können, ist, weil Sie („NOT IN“), um die Abfrage zu negieren. Soweit ich weiß, kann dies nicht ohne Verwendung der String-basierten Syntax durchgeführt werden. Wenn Sie nur finden wollten passende („IN“) Elementen, könnten Sie das Hash-Formular:

@courses = Course.where(:id => current_user.courses) 

Es ist das Negieren („NOT IN“) Teil, der es schwierig macht. Weitere Informationen finden Sie in der Active Record Query Interface Guide.

+0

danke mirthlab. Es funktioniert gut! was ist "id nicht in (?)"? Kann ich es auch mit anderen Abfragen verwenden? – daniel

+0

Ich habe ein wenig mehr Informationen und einen Link zu den Dokumenten hinzugefügt. Ich hoffe, das hilft. "NOT IN" bedeutet nur "finde Sachen, die nicht in dieser Liste von IDs sind", was im Grunde alles andere ist. Es gibt viele nette Tricks in den verlinkten Schienenführungen. Schau mal :) – markquezada

+0

Oh ich habe jetzt ein neues Problem. Ich habe 5 Gänge. Ich habe von allen nicht registriert, um es zu testen. Jetzt, weil ich "@courses = Course.where (" ID NICHT IN (?) ", Current_user.courses)" es keine Kurse in meinem Index anzeigen ^^ – daniel

1

Wenn Sie möchten, mit rohen Strings vermeiden, könnten Sie ARel

@courses = Course.where(Course.arel_table[:id].not_in(current_users.courses)) 

Leider verwenden, ARel nicht sehr gut dokumentiert ist. Ich verwende this als Referenz.

Verwandte Themen