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?

War es hilfreich?

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]}}

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top