Wenn ich eine Reihe von IDs habe, wie
ids = [2,3,5]
und ich trete auf
Comment.find(ids)
alles funktioniert gut. Aber wenn es eine ID gibt, die nicht existiert, bekomme ich eine Ausnahme. Dies tritt im Allgemeinen auf, wenn ich eine Liste von IDs erhalte, die mit einem Filter übereinstimmen, und dann so etwas mache
current_user.comments.find(ids)
Dieses Mal habe ich möglicherweise eine gültige Kommentar-ID, die jedoch nicht dem angegebenen Benutzer gehört, sodass sie nicht gefunden wird und ich eine Ausnahme erhalte.
Ich habe es versucht find(:all, ids)
, aber es werden alle Datensätze zurückgegeben.
Ich kann es jetzt nur noch tun
current_user.comments.select { |c| ids.include?(c.id) }
Aber das scheint mir eine super ineffiziente Lösung zu sein.
Gibt es eine bessere Möglichkeit, die ID im Array auszuwählen, ohne eine Ausnahme für nicht vorhandene Datensätze zu erhalten?
quelle
Array
statt eines zurückActiveRecord::Relation
, was einschränkt, was Sie danach damit machen können.Comment.where(id: [2, 3, 5])
gibt ein zurückActiveRecord::Relation
.Update: Diese Antwort ist für Rails 4.x relevanter
Mach das:
Die stärkere Seite dieses Ansatzes besteht darin, dass ein
Relation
Objekt zurückgegeben wird, dem Sie weitere.where
Klauseln,.limit
Klauseln usw. hinzufügen können, was sehr hilfreich ist. Es erlaubt auch nicht existierende IDs ohne Ausnahmen.Die neuere Ruby-Syntax wäre:
quelle
where
Syntax beim Vergleich mit einem Array bestätigt haben. Ich dachte, ich müsste das SQL möglicherweise mit einerIN
Anweisung codieren , aber dies sieht sauberer aus und ist ein einfacher Ersatz für das Veraltetescoped_by_id
.Wenn Sie mehr Kontrolle benötigen (möglicherweise müssen Sie den Tabellennamen angeben), können Sie auch Folgendes tun:
quelle
your_id_array
Sie die Objekte zurückerhalten?ORDER BY
funktioniert in meiner Situation nicht, da die Reihenfolge nicht auf einem Attribut basiert. Es gibt jedoch eine Möglichkeit, dies über SQL zu tun (es ist also schnell), und jemand hat sogar ein Juwel dafür erstellt. Schauen Sie sich diese Fragen und Antworten anJetzt sind die Methoden .find und .find_by_id in Rails 4 veraltet. Stattdessen können wir Folgendes verwenden:
Es wird auch dann funktionieren, wenn einige der IDs nicht vorhanden sind. Das funktioniert in der
Auch zum Ausschließen von IDs
quelle
Um zu vermeiden, dass Ausnahmen Ihre App beenden, sollten Sie diese Ausnahmen abfangen und wie gewünscht behandeln und das Verhalten für Ihre App in Situationen definieren, in denen die ID nicht gefunden wird.
Hier finden Sie weitere Informationen zu Ausnahmen in Ruby.
quelle
Sie können es auch in named_scope verwenden, wenn Sie dort andere Bedingungen festlegen möchten
Schließen Sie zum Beispiel ein anderes Modell ein:
quelle