wählen viele durch viele ... Art
-
21-08-2019 - |
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!
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.