it-swarm.com.de

Ist nicht gleichbedingt

Ich möchte eine Where-Klausel mit einer Gleichheitsbedingung und einer Nichtgleichbedingung:

@user = User.where(:user_id => current_user.id, :author_id != current_user.id).nil? ? (render :something) : (render :somethingelse)

Das obige funktioniert nicht:

syntaxfehler, unerwarteter ')', erwartet TASSOC ... d,: user_id! = current_user.id) .nil? ? (Rendern : Index): (Re ...

Wenn ich die zweite Bedingung von != in => ändere, funktioniert es jedoch.

Wie habe ich beide Bedingungen in einem Clase? Vielen Dank

22
user715697

So würden Sie Arel verwenden, um die Abfrage "select * from users where user_id = ? and author_id != ?" zu generieren:

users = User.arel_table
User.where(users[:user_id].      eq(current_user.id).and(
           users[:author_id].not_eq(current_user.id)))

Die Verwendung von Arel ist nicht so knapp wie die Verwendung von Hash-Bedingungen für einfache Bedingungen, aber es ist viel mächtiger!

Hier ist ein Link zur vollständigen Liste der Prädikate (eq, not_eq, gt, lt usw.), die bei Arel verfügbar sind.

23
Tyler Rick

Ich glaube, es sollte sein:

@user = User.where(['user_id = ? AND author_id <> ?', current_user.id, current_user.id])
render(@user ? :something : :somethingelse)
21
taro

Rails 4 hat dies alles herausgefunden

Model.where.not(:colname => nil)
#=> returns all records whose :colname values are not nil
18
boulder_ruby

Der Syntaxfehler ist darauf zurückzuführen, dass Sie versuchen, != anstelle von => zu verwenden. Die where-Methode unterstützt keine Ungleichung mit Hash-Argumenten. Daher müssen Sie Ihre Ungleichheit mit Array-Argumenten schreiben.

User.where(:user_id => current_user.id).where(['users.author_id <> ?', current_user.id])
7

Nicht sicher, ob Sie wissen, dass die ungleiche Bedingung normalerweise nicht mit (author_id) NULL-Werten übereinstimmt. Du musst einen OR author_id IS NULL machen, wenn du das willst.

@users = User.where("user_id = ? AND (author_id != ? OR author_id IS NULL)", 
                    current_user.id, current_user.id)

render(@users.present? ? :something : :somethingelse)

Beachten Sie auch, dass ich @users.present? verwende, da where Finder ein ActiveRecord::Relation-Array zurückgibt.

0
konyak

http://guides.rubyonrails.org/active_record_querying.html#hash-conditions

Bei Hash-Bedingungen sind nur Gleichheits-, Bereichs- und Teilmengenprüfung möglich.

Sie müssen entweder zu direktem SQL wechseln oder eine invertierte Abfrage durchführen, siehe Gibt es eine Möglichkeit, eine ActiveRecord :: Relation-Abfrage zu invertieren?

0
Jonah