Ouverture de session

Commentaires récents

Syndication
Flux XML

Equivalent rails d'une requête sql

Equivalent rails d'une requête sql
Posté par dacoury le Mercredi, 21 Novembre, 2007 - 12:37pm. Trucs & Astuces

J'ai plusieurs tables et je n'arrive pas à faire, je ne sais pas comment faire une requête imbriquée avec des includes quand il y a des conditions sur des tables du :include

T1( id, lib)
T2( id, lib, T1_id)
T3( id, lib, T2_id)
T4( id, lib, T3_id)
T5( id, lib, updated_at)

@all_row = T5.find(:all, :conditions => ["lib = ? AND updated at between ? and ?", '1', @date_debut, @date_fin], :include => {:T1 => :T5})
comment faire une condition sur le T5, T5.lib = 1.
La requête sql fonctionne mais elle est moins pratique à manipuler dans la vue

T5.find_by_sql("select t5.*, t4.*, t3.*, t2.* from T5 as t5, T4 as t4, T3 as t3, T2 as t2 WHERE t5.T4_id = t4.id and t4.T3_id = t3.id and t3.T2_id = t2.id and t2.T1_id = 1 and t5.lib = '1' and t5.updated_at between '2007-11-01' and '2007-11-30'")

J'envisage si la solution semble trop sioux de créer les champs T*_id dans chaque sous table. Peut être que ça sera plus performant. J'ai pas beaucoup d'expérience projet, c'est mon 2ème projet avec une bdd.

T1( id, lib)
T2( id, lib, T1_id)
T3( id, lib, T1_id, T2_id)
T4( id, lib, T1_id, T2_id, T3_id)
T5( id, lib, T1_id, T2_id, T3_id, updated_at)



[ Vous devez vous connecter ou vous enregistrer pour écrire des commentaires | sujet précédent | sujet suivant | envoyer par email ]

Options d'affichage des commentaires
Sélectionnez la méthode d'affichage des commentaires que vous préférez, puis cliquez sur "Sauvegarder" pour activer vos changements.

Sujet: 
Pourquoi tu ne fais pas tout
Auteur: 
dam5s
Date: 
Mer, 21/11/2007 - 16:16

Tu peux faire tout simplement:

@t5 = t5.find(:all, :conditions => ["lib = ? AND updated at between ? and ?",
                                    '1', @date_debut, @date_fin]
@t4 = @t5.t4
@t3 = @t4.t3
@t2 = @t3.t2
@t1 = @t2.t1

Mais bon avoir 5 tables comme ca, ca fait une requêtes énormes, je chercherais avant tout à améliorer la base de données... quelles sont les multiplicités des relations entre les tables?

--
Damien
http://www.webdrivenblog.com/


[ Vous devez vous connecter ou vous enregistrer pour écrire des commentaires | envoyer par email ]

Sujet: 
il manque quelque chose
Auteur: 
dacoury
Date: 
Mer, 21/11/2007 - 17:49

Y a t-il une parenthese après date de fin ? ])
Il y a aussi une condition sur le T1
Les tables ont des realtions de 1 à n:
t1 -> ( 1, n) t2
t2 -> ( 1, n) t3
t3 -> ( 1, n) t4
t4 -> ( 1, n) t5

Effectivement, je pense modifier la bdd, avec une 20 de lignes à ramener, ça prend déjà du temps.


[ Vous devez vous connecter ou vous enregistrer pour écrire des commentaires | envoyer par email ]

Sujet: 
Oui il manque la
Auteur: 
dam5s
Date: 
Jeu, 22/11/2007 - 11:24

Oui il manque la paranthèse.

Je crois que dans ce cas tu va être obligé de faire une requête sql pour ne pas avoir à en faire trop :S
Cela dit, tu peux définir une méthode dans ton model qui va automatiquement l'exécuter:


class t5 < ActiveRecord::Base
  def self.find_by_dates_and_t1(start_date, end_date, t1)
    # ta requête ici qui retourne le bon objet t5
  end
end

du coup ca va simplifier le code de ton contôleur qui y fera appel comme les autres méthodes find de ActiveRecord.

Il va de soit que tu as intérêt à écrire de bons tests unitaires pour la méthode ci-dessus, ce qui te permettra de chercher à optimiser la requête sans risque d'erreur :)

--
Damien
http://www.webdrivenblog.com/


[ Vous devez vous connecter ou vous enregistrer pour écrire des commentaires | envoyer par email ]

Nouveaux liens

Sondage
Lorsque je développe avec Ruby on Rails c'est principalement sous:
Linux
37%
Mac OS X
29%
Windows
32%
(Free|Open|Net) BSD
1%
Autre...
1%
Nombre de votes: 356

Qui est en ligne
Il y a actuellement 1 utilisateur et 102 invités en ligne.

railsfrance.org - communauté francophone des utilisateurs de Ruby on Rails
[ Hébergement et ressources techniques gracieusement fournis par la SSLL Nuxos Group ]