Ich möchte alle Benutzer verwenden, die entweder eine E-Mail-Adresse oder den Vor- und Nachnamen haben. Also zum Beispiel:
users = User.where(:first_name => "James", :last_name => "Scott")
dies gibt alle Benutzer zurück, die den Vor- und Nachnamen "James" und "Scott" haben.
users = User.where(:email => "[email protected]")
der Benutzer wird mit der E-Mail als "[email protected]" zurückgegeben.
Gibt es eine Möglichkeit, eine where
-Klausel auszuführen, um entweder die Benutzer mit dem gleichen Vor- und Nachnamen und den Benutzer mit der E-Mail zurückzugeben, die in einer where
-Abfrage übereinstimmt, oder muss ich die beiden separaten where
-Klauseln zusammenführen.
Rails 5 verfügt über eine or
-Methode .
Diese Methode akzeptiert ein ActiveRecord::Relation
-Objekt. z.B:
User.where(first_name: 'James', last_name: 'Scott')
.or(User.where(email: '[email protected]'))
Versuche dies:
users = User.where("(first_name = 'James' and last_name = 'Scott') or email = '[email protected]'")
So interpolieren Sie Variablen:
users = User.where("(first_name = ? and last_name = ?) or email = ?", first_name, last_name, email)
Wenn Sie einen DSL-Ansatz (ohne SQL) bevorzugen, können Sie die darunterliegende Arel-Schicht verwenden:
t = User.arel_table
users = User.where(
(t[:first_name].eq('Ernie').and(t[:last_name].eq('Scott')).
or(t[:email].eq('james#gmail.com'))
)
Das ist ein bisschen hässlich, aber wenn Sie einen Wrapper über Arel verwenden (zum Beispiel this ), ist der Code viel schöner:
users = User.where(
((User[:first_name] == 'Ernie') & (User[:last_name] == 'Scott')) |
(User[:email] == 'james#gmail.com')
)
Wenn Sie nicht, wie von den anderen erwähnt, SQL schreiben möchten, können Sie direkt auf die Arel-Strukturen zugreifen (eine andere Antwort scheint das zu haben), oder Sie können mit squeel gem viel eleganter vorgehen:
User.where{(first_name == 'Ernie') & (last_name == 'Scott') | (email == 'james#gmail.com')}
Sie können String-Bedingungen wie in Client.where("orders_count = ? AND locked = ?", params[:orders], false)
verwenden und OR
zusammen mit AND
verwenden. Seien Sie jedoch vorsichtig mit der Priorität dieser Bediener.