Frage

Dies ist mein erster Beitrag auf Stapel, so tragen Sie bitte mit mir, wenn ich in ein Protokoll verstoßen.

Ich arbeite an einem Projekt in Rails (2.1.2), und ich habe ein Beziehung Szenario, das wie folgt aussieht:

event [has_many] days

Menschen (in verschiedenen Kategorien) für Veranstaltungstag anmelden, die folgenden verbindlichen Ergebnisse geben:

category [has_many] customers [has_many] orders [has_many] days  
[belongs_to] event

Nun, würde Ich mag die Gesamtzahl der ‚Ereignisse‘ haben für einen Kunden oder für alle Kunden in einer bestimmten Kategorie, und ich bin fest. AFAIK, es gibt keine Möglichkeit, ein einfaches ‚find‘ ausführen kann und durch eine Reihe von Objekten, richtig? Also, was wäre die Lösung; verschachtelte Schleifen, und ein R-Verfahren die ‚Ereignisse‘ von den "Tagen in Aufträgen zu bekommen?

Bitte lassen Sie mich wissen, wenn ich unklar.

Vielen Dank für Ihre Hilfe!

War es hilfreich?

Lösung

Ich persönlich würde dies tut eine MySQL-Anweisung. Ich weiß nicht sicher, aber ich denke, es ist viel schneller als die anderen Beispiele ist (die Schienen Assoziationsverfahren verwendet wird).

Das bedeutet, dass in dem Kundenmodell Sie etwas tun könnten, wie: (Beachten Sie, dass ich nehme an, Sie die Standardzuordnung Tasten verwenden: ‚model_name_id‘)

class Customer
  def events
    Event.find_by_sql("SELECT DISTINCT e.* FROM events e, days d, orders o, customers c WHERE c.id=o.customer_id AND o.id=d.order_id AND e.id=d.event_id")
  end
end

Das wird wieder alle Ereignisse mit dem Benutzer zugeordnet ist, und nicht dupliziert (die ‚DISTINCT‘ Keyword Dafür sorgt). Sie werden, wie bei dem obigen Beispiel, verlieren Informationen über das, was Tage genau der Benutzer angemeldet. Wenn Sie diese Informationen benötigen, wenden Sie sich bitte sagen Sie es.

Auch ich habe nicht ein Beispiel für die Kategorie Modell aufgenommen, weil ich davon ausgegangen, könnten Sie meinem Beispiel, sich anzupassen. Wenn nicht, lassen Sie es mich wissen.

EDIT:

Ich habe gerade gelesen Sie wollen einfach nur die Ereignisse zählen. Das kann noch schneller durchgeführt werden (oder zumindest weniger speicherintensiv) mit der Zählung Aussage. Zu verwenden, die, verwenden Sie einfach die folgende Funktion:

def event_count
  Event.count_by_sql(SELECT DISTINCT COUNT(e.*) FROM ... ... ...
end

Andere Tipps

Ihre Modelle wahrscheinlich so aussehen:

class Category
  has_many :customers

class Customer
  has_many :orders
  has_many :days, :through => :orders # I added this
  belongs_to :category

class Order
  has_many :days
  belongs_to :customer

class Day
  belongs_to :event
  belongs_to :order

class Event
  has_many :days

Mit diesem können Sie Veranstaltungen für Kunden zählen:

events = customer.days.count(:group => 'event_id')

Es wird wieder OrderedHash wie folgt aus:

#<OrderedHash {1=>5, 2=>13, 3=>0}>

Sie können Veranstaltungen erhalten zählen

events[event_id]

events[1] # => 5
events[2] # => 13
etc.

Wenn Sie Gesamtzahl der uniq Veranstaltungen wollen:

events.size # => 3

Bei Veranstaltungen für alle Kunden in der Kategorie zählt ich so etwas tun würde:

events = {}
category.customers.each {|c| events.merge!(c.days.count(:group => 'event_id') ) }
events.size # => 9 - it should be total number of events

Aber in diesem Fall verlieren Sie Informationen, wie oft jedes Ereignis erschien.

Ich habe das nicht testen, so könnte es einige Fehler sein.

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