So wählen Sie ausnahmslos aus der ID in Array Rails ActiveCord aus
-
10-07-2019 - |
Frage
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 keine ID gibt, die es nicht gibt, bekomme ich eine Ausnahme. Dies geschieht allgemein, wenn ich eine Liste von IDs erhalte, die zu einem Filter übereinstimmen, und als ich so etwas wie ich
current_user.comments.find(ids)
Dieses Mal habe ich möglicherweise eine gültige Kommentar -ID, die jedoch nicht dem gegebenen Benutzer gehört, sodass sie nicht gefunden wird, und ich bekomme eine Ausnahme.
ich habe es versucht find(:all, ids)
, Aber es gibt alle Datensätze zurück.
Der einzige Weg, wie ich es jetzt tun kann, ist
current_user.comments.select { |c| ids.include?(c.id) }
Aber das scheint mir eine super ineffiziente Lösung zu sein.
Gibt es einen besseren Weg zum Auswählen? ID in Array Ohne Ausnahme auf nicht existierende Aufzeichnungen?
Lösung
Wenn es nur die Ausnahme vermeidet, über die Sie sich Sorgen machen, funktioniert die Funktion der Funktionen "find_all_by". Die Familie der Funktionen funktioniert ohne Ausnahmen.
Comment.find_all_by_id([2, 3, 5])
wird funktionieren, auch wenn einige der IDs nicht existieren. Dies funktioniert in der
user.comments.find_all_by_id(potentially_nonexistent_ids)
Fall auch.
Update: Rails 4
Comment.where(id: [2, 3, 5])
Andere Tipps
Update: Diese Antwort ist für Rails 4.x relevanter
Mach das:
current_user.comments.where(:id=>[123,"456","Michael Jackson"])
Die stärkere Seite dieses Ansatzes ist, dass er a zurückgibt a Relation
Objekt, dem Sie mehr beitreten können .where
Klauseln, .limit
Klauseln usw., was sehr hilfreich ist. Es ermöglicht auch nicht existierende IDs ohne Ausnahmen.
Die neuere Ruby -Syntax wäre:
current_user.comments.where(id: [123, "456", "Michael Jackson"])
Wenn Sie mehr Kontrolle benötigen (möglicherweise müssen Sie den Tabellennamen angeben), können Sie auch Folgendes tun:
Model.joins(:another_model_table_name)
.where('another_model_table_name.id IN (?)', your_id_array)
Jetzt sind .find und .find_by_id -Methoden in Schienen veraltet. Daher können wir also unten verwenden:
Comment.where(id: [2, 3, 5])
Es wird funktionieren, auch wenn einige der IDs nicht existieren. Dies funktioniert in der
user.comments.where(id: avoided_ids_array)
Auch zum Ausschluss von IDs
Comment.where.not(id: [2, 3, 5])
Um Ausnahmen zu vermeiden, die Ihre App töten, sollten Sie diese Ausnahmen fangen und sie so behandeln, wie Sie es wünschen, und definieren Sie das Verhalten für Ihre App in den Situationen, in denen die ID nicht gefunden wird.
begin
current_user.comments.find(ids)
rescue
#do something in case of exception found
end
Hier ist Mehr Info Bei Ausnahmen in Ruby.
Sie können es auch in namern_scope verwenden, wenn Sie dort andere Bedingungen einsetzen möchten
Zum Beispiel ein anderes Modell enthalten:
NAME_SCOPE 'get_by_ids', lambda {| ids | {: include => [: Kommentare],: Bedingungen => ["Kommentare.id in (?)", ids]}}