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!

macht
War es hilfreich?

Lö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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top