2016-08-01 17 views
1

Entfernen habe ich eine Sammlung, die eine Klasse enthält wie:ein Element aus einer In-Memory-Sammlung

locations = Location.all 

class Location < ActiveRecord::Base 
end 

Die Lage Klasse eine Eigenschaft hat: Code

I wan ein Element aus der Sammlung entfernen Wenn Code == "unbenutzt".

Wie viele verschiedene Möglichkeiten kann ich dies in Ruby tun?

ich derzeit dies tue:

locations = Location.all.select { |l| l.code != "unused" } 

Dies funktioniert gut, aber frage mich, was andere Möglichkeiten, wie ich dies zu Lernzwecken nur tun könnten (wenn es große Leistungsvorteile in einer anderen Art und Weise, die gut wäre auch zu wissen,).

Update Bitte ignorieren Sie die Tatsache, dass ich meine Sammlung zunächst aus der Datenbank laden, das war nicht der Punkt. Ich möchte lernen, wie die Dinge zu entfernen, im Speicher nicht einfach, wo Klauseln :)

+3

Von Codierstil Perspektive, sollten Sie vielleicht lieber 'ablehnen {| l | l.code == "unused"} 'over' selektiere {| l | l.code! = "unused"} (Bedingungen mit Negation induzieren mehr kognitive Belastung). Außerdem kann ich nicht einfach die Tatsache ignorieren, dass Sie eine einzelne Zeichenvariable "1" verwenden, von der bekannt ist, dass sie falsch gelesen wird als Nummer "l" (oder umgekehrt;) – TeWu

+0

@TeWu Sie sind ein bisschen böse. –

Antwort

3

Sie einfach Datensätze aus der Datenbank holen können, was Sie brauchen:

Rails 4 ab:

locations = Location.where.not(code: "unused") 

Vor Rails 4:

locations = Location.where("code != ?", "unused") 


Wenn Sie eine Sammlung haben und Sie möchten einige Elemente daraus reject, dann können Sie dies versuchen:

locations.reject! {|location| location.code != "unused"} 
+0

Entschuldigung siehe mein Update auf die Frage, ich versuche In-Memory-Techniken zu lernen. – Blankman

1

Sie sind das der falsche Weg. In diesem Fall rufen Sie alle Datensätze aus der DB ab und erhalten ein Array von Datensätzen. Dann suchen Sie nach Datensätzen, die Sie im Array benötigen. Stattdessen sollten Sie die Datensätze direkt von der DB erhalten:

Location.where("code != 'unused'") 
# or in Rails 4 and latest 
Location.where.not(code: "unused") 

Wenn Sie Datensätze aus DB entfernen müssen, können Sie es wie folgt tun:

Location.where.not(code: "unused").destroy_all 

Wenn Sie nur wissen wollen, was das ist Beste Möglichkeit, Elemente aus einem bestehenden Array zu entfernen, ich denke, Sie sind auf dem richtigen Weg. Neben select gibt es reject, reject!, delete_if Methoden. Sie können mehr über sie in der Dokumentation lernen http://ruby-doc.org/core-2.3.1/Array.html

Es gibt einen Zusammenhang Beitrag ist, die mehr Informationen liefern könnten: Ruby .reject! vs .delete_if

+1

Entschuldigung siehe mein Update zu der Frage, ich versuche In-Memory-Techniken zu lernen. – Blankman

Verwandte Themen