Has_many or

Bonjour,

Je débute dans rails et je trouve face à un dilemme.

Je développe (enfin j’essaye) une application qui gère des stats
d’évènements sportifs (foot, rugby, basket, choisissez…)
J’ai une table ‘matches’ avec les champs suivants :
t.date :date
t.integer :home_id # clé étrangère vers l’équipe qui reçoit
t.integer :away_id # clé étrangère vers l’équipe qui se
déplace
t.integer :home_score_halftime
t.integer :away_score_halftime
t.integer :home_score_final
t.integer :away_score_final

J’ai également un model Matches avec le code suivant :
has_many :home_matches, :class_name => ‘Event’, :foreign_key =>
‘home_id’
has_many :away_matches, :class_name => ‘Event’, :foreign_key =>
‘away_id’
has_many :won_matches_at_home, :class_name => ‘Event’, :foreign_key
=> ‘home_id’,
:conditions => ‘home_score_final > away_score_final’
has_many :won_matches_away, :class_name => ‘Event’, :foreign_key =>
‘away_id’,
:conditions => ‘home_score_final < away_score_final’
has_many :matches, :class_name => ‘Event’, :finder_sql =>
'SELECT DISTINCT * '+
'FROM teams t, events e '+
'WHERE (e.home_id=#{id} AND t.id=e.home_id) OR '+
'(e.away_id=#{id} AND t.id=e.away_id) '+
‘ORDER BY e.date DESC’
has_many :won_matches, :class_name => ‘Event’, :finder_sql =>
'SELECT DISTINCT * '+
'FROM teams t, events e '+
'WHERE (e.home_id=#{id} AND home_score_final > away_score_final AND
t.id=e.home_id) OR '+
'(e.away_id=#{id} AND home_score_final < away_score_final AND
t.id=e.away_id) '+
‘ORDER BY e.date DESC’
has_many :lost_matches, :class_name => ‘Event’, :finder_sql =>
'SELECT DISTINCT * '+
'FROM teams t, events e '+
'WHERE (e.home_id=#{id} AND home_score_final < away_score_final AND
t.id=e.home_id) OR '+
'(e.away_id=#{id} AND home_score_final > away_score_final AND
t.id=e.away_id) '+
‘ORDER BY e.date DESC’
has_many :draws, :class_name => ‘Event’, :finder_sql =>
'SELECT DISTINCT * '+
'FROM teams t, events e '+
'WHERE (e.home_id=#{id} AND home_score_final = away_score_final AND
t.id=e.home_id) OR '+
'(e.away_id=#{id} AND home_score_final = away_score_final AND
t.id=e.away_id) '+
‘ORDER BY e.date DESC’

Je crois que cela fonctionne même s’il faut que je vérifie encore un
peu je crois.

Le problème est que je n’aime pas ce code :slight_smile:
Je le trouve moche et trop répétitif.

Est-ce que vous connaitriez une astuce ou un tour de passe-passe pour
que rendre tout ça plus élégant ?

Merci de votre aide.

arnaud

Bonjour,

Le code est pas super facile à lire, mais a mon avis regarde du côté des
named_scope sur ton modèle Event.
Après je comprend pas le modèle Matches avec has_many :matches.

Le 13 nov. 2009 à 23:34, arnaud a écrit :

Hmm, tes associations se trompent de sens.

belongs_to se fait sur la table qui porte l’id d’une table étrangère,
parce
que c’est cette table dont les éléments s’attache à ceux d’une autre
has_one ou has_many se fait sur une table qui est pointé par une clef
étrangère d’une autre table

Exemple :

En imaginant deux tables :

table jappartiens :
id
je_possede_id

table je_possedes
id

Les modèles porteront les associations suivante :

class Jappartien < AR::B
belongs_to :je_possede

end

class JePossede < AR::B
has_many :jappartiens

end

Donc soit tu as mal placé tes clefs étrangères, soit tu te trompe sur le
rôle des associations, mais je pencherais plutôt pour la première
hypothèse.

En espérant que ça aide.

Michel B.

2009/11/14 Guillaume BELLEGUIC [email protected]

Euh oui il y a une coquille dans mon message.
Il fallait lire :
“J’ai également un model Teams avec le code suivant :”
au lieu de
“J’ai également un model Matches avec le code suivant :”

Je vais creuser du côté des named_scope ça à l’air d’être ce dont j’ai
besoin

merci de vos réponses :slight_smile:

Arnaud Icard

Le 14 novembre 2009 08:35, Michel B.
[email protected] a
écrit :