2016-07-18 11 views
2

Ich habe eine Google-Suche durchgeführt und ähnliche Fragen zu meiner Frage here gefunden, jedoch bin ich immer noch verloren, was die Lösung sein sollte. Mein Fall ist folgende:Schienen 4: model.where.not gibt keine Null Datensätze

Ich habe eine Datenbanktabelle Book genannt, wo es category_id (Fremdschlüssel zur Tabelle Category) hat und author (varchar 255). Ich muss diese Tabelle durch category_id abfragen, aber den Namen des bestimmten Autors ausschließend. Beispiel: erhalten Sie alle Bücher für category_id = 10, aber ohne Bücher von Autor John Doe:

books = Book.where(category_id: 10).where.not(author: 'John Doe') 

oder

books = Book.where(category_id: 10).where("author != ?", "John Doe") 

Diese beiden Abfragen für mich arbeiten, außer auf jene Datensätze, deren Autor ist nil. Ich muss diese Abfragen auch Datensätze zurückgeben, die nil Autor haben.

+0

haben Sie das versucht? books = Book.where (category_id: 10) .where ("Autor <>? OR author =?", "John Doe", null) – power

+0

"NULL" ist unbekannt, daher müssen Sie es speziell nach @ angeben. Chrismandersons Antwort. –

Antwort

8

Sie waren mit der letzten Abfrage auf dem richtigen Weg.

Book.where(category_id: 10).where("author != ? OR author IS NULL", "John Doe") 

Dies sollte tun, was Sie fragen.

Exkurs, in Rails 5 können Sie or mit ActiveRecord Abfragen verwenden, so könnte man so wie etwas:

Book.where(category_id: 10).where.not(author: 'John Doe').or(where(author: nil)) 

Obwohl ich würde behaupten, in diesem Fall die erste Abfrage klarer ist.

+0

Für einen objektorientierten Ansatz in Rails 4 können Sie auch [dieses Schmuckstück] (https://github.com/oelmekki/activerecord_any_of) verwenden. Siehe [dieses Beispiel] (https://github.com/oelmekki/activerecord_any_of#dynamic-or-queries) als Inspiration. –

+1

Der Grund hier ist, dass "x" = NULL ist falsch, aber "x"! = NULL "ist auch falsch. Grundsätzlich ist 'NULL' nicht gleich oder ungleich zu anderen Werten einschließlich sich selbst, daher ist 'IS NULL' erforderlich. – tadman

Verwandte Themen