Ok. Soyez indulgent avec moi, car je dois fournir beaucoup de détails contextuels avant de pouvoir solliciter une réponse raisonnable à ma question.
J'ai un site qui vous permet de faire des choix d'actions quotidiens. Le principe est le suivant : vous êtes invité à choisir entre les entreprises qui s'affrontent pour la journée. Par exemple, GE contre IBM. Vous pouvez faire deux types de choix : Performance (quelle action sera la plus performante ?) et Volume total (les actions combinées seront-elles négociées à des volumes supérieurs ou inférieurs à X ?). Chaque jour, vous disposez de 100 dollars virtuels pour faire vos choix.
En fin de compte, notre objectif ici est de suivre quel utilisateur gagne le plus d'argent par sélection dans diverses catégories (expliquées ci-dessous) sur les périodes suivantes : 5 jours, 15 jours, 30 jours, 90 jours, 180 jours, 1 an, tout le temps. Il est très simple de calculer combien d'argent est gagné par sélection. Il s'agit de l'argent total gagné (ou perdu) / nombre de picks.
Maintenant, chaque entreprise sur laquelle l'utilisateur fait un choix relève d'une hiérarchie catégorielle. Généralement, la hiérarchie catégorielle ressemble à ceci :
Division --> Grand groupe --> Groupe industriel --> Classification --> Société
Voici quelques exemples :
- Exploitation minière --> extraction de métaux --> minerais de fer --> extraction de minerais bruns --> Compagnie A
- Exploitation minière --> extraction de métaux --> minerais de fer --> extraction de minerais bruns --> Compagnie B
- Exploitation minière --> extraction de métaux --> minerais de fer --> extraction de limonite --> Compagnie C
- Exploitation minière --> Mines de métaux --> Minerais de fer --> Exploitation de la limonite --> Entreprise D
- Industrie manufacturière --> Produits du tabac --> Cigares --> Stogies --> Company E
- Industrie manufacturière --> Produits du tabac --> Cigares --> Stogies --> Entreprise F
- Industrie manufacturière --> Produits du tabac --> Cigares --> Cigarillos --> Company G
- Industrie manufacturière --> Produits du tabac --> Cigares --> Cigarillos --> Entreprise H
- et ainsi de suite
Il y a un modèle pour chaque catégorie (et la table correspondante, bien sûr), et ils sont associés (pensez à la clé étrangère) comme vous le voyez ci-dessus.
Il existe un modèle pour le Matchup, chaque enregistrement représentant les entreprises qui s'affrontent pour la journée. Chaque enregistrement conserve la trace du cours initial et du cours final de l'action de chaque société, ainsi que le volume total des échanges.
Chaque matchup a un ou plusieurs :pick_prices qui peuvent changer tout au long de la journée. Normalement, chaque matchup a un :pick price de performance et un :pick price de volume total. Le prix détermine ce que le choix vous coûtera et combien vous gagnez pour un choix correct. (Tout ceci n'est qu'une information générale. Vous n'avez pas besoin de vous soucier de ces calculs de prix particuliers).
À la fin de la journée de négociation, les choix de l'utilisateur sont résolus. Les choix sont représentés dans un modèle de choix, avec les attributs suivants :
- nom d'utilisateur
- montant_dépensé (par exemple, 10 $)
- le résultat (par exemple, WON, LOST)
- choisir (par exemple, l'entreprise A)
- matchup_id
- pick_price_id
- montant_gagné
- résolu (vrai ou faux)
- créé_at
- updated_at
Actuellement, lorsque chaque prélèvement est résolu, une autre table est mise à jour, appelée pick_records, qui possède les attributs suivants :
- nom d'utilisateur
- id. enregistrable
- recordable_type (Division ou Grand Groupe ou Groupe Industriel ou Classification ou Société)
- picks (total des picks effectués, quel que soit le type de pick)
- gagnés (total des choix gagnés, quel que soit le type de choix)
- perdu (total des picks perdus, quel que soit le type de pick)
- argent (argent total gagné)
- money_per_pick (argent / picks)
- performance_picks
- performance_won
- perte de performance
- argent_de_la_performance
- performance_argent_par_pick
- volume_pics
- volume_won
- volume_perdu
- volume_argent
- volume_argent_par_pick
- créé_at
- updated_at
Comme vous pouvez le constater, il s'agit d'un modèle polymorphe. Le tableau regroupe les statistiques des records de picking de tous les temps.
Alors maintenant, voici le défi :
Compte tenu de la conception existante, que dois-je faire pour pouvoir saisir les enregistrements de prélèvement de l'utilisateur sur les périodes suivantes : 5 jours, 15 jours, 30 jours, 90 jours, 180 jours, 1 an, tous les temps ? Il faut que ce soit simple, efficace et rapide !
J'utilise actuellement Rails 2.3.11 sur une base de données MySQL.