web-dev-qa-db-de.com

Wie benutzt man OR Bedingung in der ActiveRecord-Abfrage

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.

21
Matt Elhotiby

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]'))
35
Santhosh

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)
12
Anil

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')
)
8
tokland

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')}
5
DGM

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.

Cf Active Record Query-Schnittstellenhandbuch

0
ksol