2016-11-03 3 views
-2

ich herauszufinden versuche, wie inject Methode funktioniertIch brauche Erklärung der Methode injizieren

Kann jemand erklären, diese

def mysort 
    if djeca.any? 
     djeca.order(name: :asc).inject([]) { |sum, c| sum += c.mysort}.uniq 
    else 
     [self] 
end 

mysort ist Methode der Modellklasse Books

In Controller I-Methode aufrufen mysort:

@mybooks= Books.find_by(name: 'renesansa') 
@mybookss= @mybooks.leaf_wms 
+0

http://matthewcarriere.com/2008/06/23/using-select-reject-collect-inject-and-detect Dieser Link gute Erklärung hat – Sivalingam

+0

https://ruby-doc.org/core-2.2.3/Enumerable.html # method-i-inject – Santhosh

+0

Ist das Modell Bücher wirklich eine Sammlung von Büchern oder nur ein Buch? Modell sollte einen einzigartigen Namen haben. Siehe http://stackoverflow.com/questions/10078139/ruby-on-rails-plural-controller-and-singular-model-convention-explanation –

Antwort

0
djeca.order(name: :asc).inject([]) { |sum, c| sum += c.mysort}.uniq 

entspricht

sum = [] 
djeca.order(name: :asc).each{|c| sum = sum + c.mysort} 
sum.uniq 

Hinzufügen von Arrays ist eigentlich concatening, so Code anhängt nur alle c.mysort in einem Array.

Wenn ich es richtig verstehe, kann man auch schreiben:

djeca.order(name: :asc).map{|c| c.mysort}.flatten.uniq 

auf Ihr Publikum Je, möchten Sie vielleicht das eine oder andere schreiben. Beachten Sie, dass Sie im inject-Block keinen Wert zur Summe zuweisen müssen, dies erfolgt automatisch.

(1..10).inject(0){|mem,i| mem += i} 
#=> 55 

(1..10).inject(0){|mem,i| mem + i} 
#=> 55 
+0

Tnx für Ihre Antwort, ich verstehe diesen Teil c.mysort nicht in der Methode mysort nennen wir Methode mysort. Ist das Rekursion? – ivan

+0

Ich habe meine Frage aktualisiert, wenn die Anweisung verpasst wurde – ivan

0

Sie sollten t folgen seine Verbindung https://samurails.com/tips/ruby-ruby-on-rails-inject/

Zum Beispiel:

result = [1,2,3,4].inject(0) { |sum, number| sum + number } 

Hier beginnt der Prozess von 0 Index zum 3 Index. Die erste Injektion fügt 1 & 2 hinzu, um die Summe von zwei Werten zu erhalten, und wird in sum Variable gespeichert (d. H. Summe = 3) und dann nimmt sie den sum Wert und fügt 3 hinzu, um das Ergebnis zu erhalten (d. H. Summe = 6) und so weiter. Schließlich erhalten Sie das Ergebnis wie 10.

0

djeca.order (name:: Asc)

Ruft Anordnung von aktiven Datensätzen

.inject ([])

durch jede Looping Aktiver Rekord. Die ursprüngliche Ausgabe von inject ist leeres Array [].

{| sum, c | }

c - jeder aktiven Datensatz

sum - Ausgangswert einzuspritzen. Anfangs ist es []. Bei jeder Iteration wird der Wert an das Array angehängt. (Summe + = [einige Werte])

Verwandte Themen