2009-07-01 8 views
1

Ceci est mon premier post sur Stack, alors s'il vous plaît ours avec moi si je ne respecte aucun protocole.sélectionnez beaucoup à travers beaucoup ... genre de

Je travaille sur un projet Rails (2.1.2), et j'ai un scénario de relations qui ressemble à ceci:

event [has_many] days 

personnes (dans différentes catégories) peuvent vous inscrire pour les jours de l'événement, donnant les résultats de liaison suivants:

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

maintenant, je voudrais avoir le nombre total des « événements » pour un client, ou pour tous les clients dans une certaine catégorie, et je suis coincé. AFAIK, il n'y a aucun moyen d'effectuer une simple "découverte" à travers un tableau d'objets, correct? Alors, quelle serait la solution? boucles imbriquées, et une méthode de collecte pour obtenir les «événements» des «jours» dans les commandes?

S'il vous plaît laissez-moi savoir si je ne sais pas.

Merci pour votre aide!

+0

Votre premier message est en fait lié à la programmation, vous êtes donc sur la bonne voie. –

Répondre

0

Je le ferais personnellement en utilisant une instruction MySQL. Je ne sais pas avec certitude, mais je pense que c'est beaucoup plus rapide que les autres exemples (en utilisant les méthodes d'association fournies par les rails).

Cela signifie que dans le modèle client que vous pourriez faire quelque chose comme: (Notez que je suppose que vous utilisez les clés d'association par défaut: « 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 

qui renverra tous les événements associé à l'utilisateur, et non dupliqué (le mot clé 'DISTINCT' s'en assure). Comme dans l'exemple ci-dessus, vous perdrez des informations sur les jours où l'utilisateur s'est inscrit exactement. Si vous avez besoin de ces informations, veuillez le dire.

De plus, je n'ai pas inclus d'exemple pour votre modèle de catégorie, car j'ai supposé que vous pouviez adapter mon exemple vous-même. Si non, faites le moi savoir.

EDIT:

Je viens de lire que vous voulez juste compter les événements. Cela peut être fait encore plus rapidement (ou du moins, moins de mémoire intensive) en utilisant l'instruction count. Pour l'utiliser, utilisez simplement la fonction suivante:

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

Vos modèles ressemblent probablement comme ceci:

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 

Avec cela, vous pouvez compter les événements pour le client:

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

Il retournera OrderedHash comme ceci:

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

Vous pouvez Obtenir les événements comptent par:

events[event_id] 

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

Si vous voulez nombre total d'événements uniq:

events.size # => 3 

En cas d'événements comptant pour tous les clients dans la catégorie que je ferais quelque chose comme ceci:

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

Mais dans ce cas, vous perdre l'information combien de fois chaque événement est apparu.

Je n'ai pas testé cela, donc il pourrait y avoir quelques erreurs.

Questions connexes