2011-01-12 4 views
2

Ich habe zwei Einträge in der Datenbankwie Anzahl von Tag zu finden, paßt in Handlungen als markierbare auf

Obj1 mit „Hallo, Welt, plante“ markiert ist Obj2 mit „Hallo“

markiert ist, wenn Ich mache ModelName.tagged_with (["Hallo", "Welt", "Planet", "Erde"],: any => true)

Ich möchte die zurückgegebenen Objekte in der Reihenfolge der höchsten bis niedrigsten Anzahl von Tags sortieren abgestimmt. Also in diesem Fall möchte ich die Bestellung Obj1, Obj2

Wie kann ich das tun? Gibt es eine Möglichkeit, die Anzahl der Tags für jedes der zurückgegebenen Ergebnisse zu erhalten?

+0

Sprache/Plattform/Frage? – leppie

+0

Ruby auf Schienen und ich benutze die Acts-als-Taggable-auf Edelstein – Varun

Antwort

3

Sie können tag_list auf die Objekte nennen, und dass, um herauszufinden, verwenden, wie viele Tags gibt es:

tags = %w{hello world planet earth} 
objs = ModelName.taggedWith(tags, :any => true) 
objs.sort_by! { |o| -(tags & o.tag_list).length } 

Die tags & o.tag_list die Kreuzung der Tags führt Sie suchen und die Tags gefunden, wir dann negiere die Größe des Schnittpunktes, um sort_by zu sagen (die in aufsteigender Reihenfolge sortiert), um größere Kreuzungen an der Vorderseite zu platzieren. Das Ergebnis zu negieren ist eine einfache Möglichkeit, die übliche Sortierreihenfolge umzukehren.

+0

, aber das wird nur nach Anzahl der Tags die Objekte haben, möchte ich es nach Anzahl der übereinstimmenden Tags sortieren. Wenn also obj1 mit "hallo, amerika, kanada, iphone" und obj2 mit "hallo, welt" und ich mit obj.tagged_with ("hallo, welt") getaggt ist, sollte es (in dieser reihenfolge) obj2, obj1 (da obj2 die höchste Anzahl an übereinstimmenden Tags hat) – Varun

+0

Entschuldigung, sieht mein Update besser aus? –

+0

das funktioniert super! Vielen Dank :) – Varun