ActiveRecord wo Feld =? Array möglicher Werte

Antworten:

157

Von hier aus scheint es mit einer SQL- inAnweisung zu geschehen :

Model.where('id IN (?)', [array of values])

Oder einfacher, wie kdeisz betonte (Verwenden von Arel zum Erstellen der SQL-Abfrage):

Model.where(id: [array of values])
Will Richardson
quelle
6
Dies kann vereinfacht werdenModel.where(id: [array of values])
kddeisz
Model.where ("id in (?)", [1..8]) scheint für mich nicht zu funktionieren. irgendwelche Ideen?
BKSpurgeon
Sie brauchen die eckigen Klammern nicht, 1..8ist bereits Array-ähnlich.
Will Richardson
1
Entgeht diese Syntax automatisch einfachen Anführungszeichen innerhalb des [Array von Werten]?
WiredIn
1
Wenn mein Array groß genug ist, nimmt die Methode viel Zeit in Anspruch. Wie könnte man das mit wirklich großen Arrays machen?
jgomo3
6

Zur besseren Lesbarkeit kann dies noch weiter vereinfacht werden, um:

Model.find_by(id: [array of values])

Dies entspricht der Verwendung where, ist jedoch expliziter:

Model.where(id: [array of values])
Egoistisch
quelle
find_byist eigentlich where().take. Model.find_by(id: [1, 2, 3])wird nur zurückkehrenModel(id: 1)
James.Oliver
Eine weitere Option, wenn Sie nur nach einem einzelnen Datensatz anstelle des Arrays suchen, das die Kriterien erfüllt.find_by_id([1, 2, 3])
Steve,
2

Sie können den Operator 'in' verwenden:

Model.in(id: [array of values])
BinaryMan
quelle
0

Wenn Sie nach einer Abfrage in Mongoid suchen, ist dies die richtigeModel.where(:field.in => ["value1", "value2"] ).all.to_a

Prithviraj Pillai
quelle
0

Es gibt einen 'kleinen' Unterschied zwischen where und find_by .

find_by gibt nur einen Datensatz zurück, wenn er gefunden wird, andernfalls ist er gleich Null.

Findet den ersten Datensatz, der den angegebenen Bedingungen entspricht. Es gibt keine implizite Bestellung. Wenn die Bestellung wichtig ist, sollten Sie sie selbst angeben. Wenn kein Datensatz gefunden wird, wird null zurückgegeben.

  def find_by(*args)
      where(*args).take
    rescue RangeError
      nil
  end

mittlerweile , wo es eine Beziehung zurückkehren

Gibt eine neue Beziehung zurück, die das Ergebnis des Filterns der aktuellen Beziehung gemäß den Bedingungen in den Argumenten ist.

In Ihrer Situation lautet der entsprechende Code also:

Model.where(id: [array of values])
mmsilviu
quelle