2 Stimmen

Rails-Methode, um alle absteigenden Kategorien zu erhalten

Zuvor wurde mir eine prägnante und ausgezeichnete Methode gezeigt, um alle Vorgängerkategorien für eine bestimmte Kategorie in einer Rails-Anwendung zu erhalten:

def ancestors
  result = []
  c = self
  while c.parent
    result.unshift(c.parent)
    c = c.parent
  end
  result
end   

Jetzt versuche ich herauszufinden, wie man alle absteigenden Kategorien für eine bestimmte Kategorie (Kinder, Kinder von Kindern, etc.) zu erhalten. Das nächste, was ich in der Lage gewesen, ist die folgende, aber ich habe immer noch das Problem, wo das endgültige Ergebnis-Array durcheinander ist. Die Arrays der obersten Ebene sind nicht geschlossen. Ich habe mit diesem stundenlang ringen und bin nicht sicher, wie es zu beheben.

def descendants

  result = []
  c = self

  for child in c.children
   result.push(child)
   if(child.children.any?)
    result.push(child.descendants)
   end
  end

  result

end

5voto

Harish Shetty Punkte 63187

Versuchen Sie dies:

def descendants
  children.map(&:descendants).flatten
end

def ancestors
  [parent, parent.try(:ancestors)].compact.flatten
end

Das manuelle Durchlaufen von Bäumen hat Auswirkungen auf die Leistung. Sie sollten die Verwendung eines Edelsteins wie Ahnenforschung die eine sehr gute Darstellung von Bäumen ermöglicht.

Edición 1

Wenn Sie die awesome_nested_set gem, beachten Sie bitte, dass es ancestors y descendants Methoden auf AR-Instanz. Sie können die Ergebnisse dieser Methoden mit Ruby sortieren (wenn Sie es mit einer kleinen Menge < 100 zu tun haben).

category.descendants.sort_by(&:name)

0voto

Marc Punkte 2514

Auch acts_as_tree ist ein großartiger Edelstein von Rails: https://github.com/rails/acts_as_tree

Ich verwende es für genau diesen Zweck und es automatisiert alles.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X