finden alle Kinder eines Objekts getaggt mit acts_as_taggable_on
-
05-07-2019 - |
Frage
Ich habe eine Schienen-Website mit zwei Modellen: Veranstaltungen und Termine
Veranstaltungen haben viele Termine
Ereignisse sind verschlagwortet mit acts_as_taggable_on
Ich versuche, alle Daten (chronologische Reihenfolge) für Veranstaltungen mit einem bestimmten Tag versehen zu finden. Ich kann herausfinden, wie um alle markierten Ereignisse zu bekommen, aber ich kann nicht herausfinden, wie von Ihnen gewünschten Termin zu erhalten.
Das Endergebnis ich suche ist ein Kalender ähnlicher Ereignisse zu schaffen, in denen Ereignisse auf jedem ihrer Termine angezeigt werden.
Wir hoffen, dass Sinn, vielen Dank für jede und alle Eingaben!
machtLösung
Wie Sie wissen Events.tagged_with("my_tag")
eine Liste von Ereignissen gibt Ihre Tags entsprechen.
Sie können dann die Karte verwenden oder auf dieser Liste sammeln Bediener eine Liste der Daten für jedes Ereignis zu erhalten.
`map{|e| e.dates}`
Dies gibt eine Liste von Datumsfeldern, wobei jedes Array die Liste der Daten mit der Veranstaltung in diesem Index in der Liste von Events.tagged_with("my_tag")
zurück zugeordnet
Um nach Datum bestellen Sie müssen abzuflachen und zu sortieren.
flatten.sort{|a,b| a.created_at <=> b.created_at}
Herstellung des gesamten Methodenaufruf:
Events.tagged_with("my_tag").map{|e| e.dates}.flatten.sort{|a,b| a.created_at <=> b.created_at}
Sie können diese Vereinfachung mit einem benannten Umfang zu Terminen. Es wird eine schnellere Abfrage sein, aber ich kann nicht für Sie schreiben, ohne mehr über die Struktur der Datenbank zu kennen.
Es wäre in etwa so aussehen, vorausgesetzt, Daten gehören zu einem Ereignis:
class Date < ActiveRecord::Base
...
named_scope :for_tag, lambda do |tag|
{:joins => [:tags, :taggings],
:conditions => ["tags.name = ? AND tags.id = taggings.tag_id \
AND taggings.taggable_id = dates.event_id AND \
taggings.taggable_type = event", tag],
:order => 'dates.created_at'}
end
end
Sie könnten dann Date.for_tag("my_tag")
tun und die gleiche Liste abrufen, in einer wesentlich effizientere SQL-Abfrage.