2017-10-24 5 views

Antwort

1

Es gibt zwei Möglichkeiten, dies zu tun. Angenommen, Sie haben ein Active Beziehung records genannt und suchen nach id:

  1. Sie die ActiveRecord::FinderMethods#find Methode verwenden können, aber dies in einem anderen Aufruf der Datenbank führen wird:

    records.find(id)

  2. Sie kann die Sammlung durchsuchen, ohne die Datenbank zu verwenden, indem Sie Rubys Enumerable#find Methode wie folgt aufrufen:

    records.find { |r| r.id == id }

Obwohl sie den gleichen Namen, wir Aufruf zwei verschiedene find Verfahren in dem obigen Beispiel. Der erste wird mehr Datenbankressourcen verwenden, während der zweite mehr Anwendungsserverressourcen verwendet. Ich bin mir nicht sicher, welcher am Ende schneller ist.

+1

Ich würde hinzufügen, dass trotz des gleichen Namens 1 ist [ActiveRecord :: FinderMethods # finden] (http://api.rubyonrails.org/v5.1/classes/ActiveRecord/FinderMethods.html#method-i-find) und das spätere ist [Enumerable # find] (http://ruby-doc.org/core-2.4.2/Enumerable.html#method-i-find). – max

1
TableName.find(id) 

sollte es tun.

Oder, wenn Sie bereits eine Reihe von Datensätzen in einer Active Record-Abfrage können Sie das mit der bekannten ID herausziehen wie:

active_record_query = User.where(first_name: "Jim") 
record = active_record_query.where(id: record_id).first 
1

Gesetzt ich eine Ergebnismenge von Benutzern haben, und ich möchte den Benutzer mit ID = 3 in diesem Satz zu finden:

foo = User.all 
user3 = foo.find {|x| x.id == 3} 

Natürlich, wenn Sie die ID kennen, können Sie es einfach finden. Angenommen, ich habe eine Tabelle Benutzer und ich weiß, dass die ID des Benutzers Ich mag 3:

user3 = User.find(3) 
1

Sie Datensätze mit aus der Datenbank mit ActiveRecord::FinderMethods#find finden.

Thing.find(1) Abfrage der Datenbank für SELECT things.* FROM things WHERE things.id = 1. Und erhöhe einen ActiveRecord::NotFoundError, wenn der Datensatz nicht gefunden werden kann. Suchen kann auch mit einer Liste von IDs verwendet werden.

Wenn Sie eine Beziehung haben, die bereits aus der Datenbank geladen wurde, verwenden Sie Enumerable#find oder den Alias ​​#detect. ActiveRecord :: Relation enthält Enumerable, so dass es auch funktioniert, wenn Sie nicht explizit in ein Array mit .to_a umwandeln.

Übergibt jeden Eintrag in Enum zu blockieren. Gibt den ersten zurück, für den der Block nicht falsch ist. Wenn kein Objekt übereinstimmt, ruft ifnone auf und gibt sein Ergebnis zurück, wenn es angegeben wird, oder gibt andernfalls nil zurück.

Beispiel:

[1,2,3,4].find(&:even?) # => 2 
User.all.load.find { |u| u.id == 1 } 
Verwandte Themen