IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Ruby on Rails Discussion :

Find n'affiche pas les champs des tables jointes


Sujet :

Ruby on Rails

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 11
    Points : 11
    Points
    11
    Par défaut Find n'affiche pas les champs des tables jointes
    Bonjour,

    Je débute en rails et essaie de comprendre les associations.
    En travaillant sous la console rails, je constate que find n'affiche pas les champs des tables jointes.
    Sur mon appli (une gestion de bibliothèque), je passe directement des requetes sql et le résultat est le même.
    Auteur.find_by_sql("select * from auteurs left join livres ....") n'affiche que des champs de auteurs.
    Livre.find_by_sql("select * from auteurs left join livres ....") n'affiche que des champs de livres.

    Comment obtenir la totalité des champs

  2. #2
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2011
    Messages
    239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Novembre 2011
    Messages : 239
    Points : 424
    Points
    424
    Par défaut
    Bonjour,

    dans tes models Auteur.rb et Livre.rb, tu as du définir les associations ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class Auteur < ActiveRecord::Base
      has_many :livres
    end
     
    class Livre < ActiveRecord::Base
      belongs_to :auteur
    end
    Sous la console, @auteurs = Auteur.find_by_sql("select * from auteurs left join livres ....") va te retourner une collection d'auteur
    si tu regarde le premier
    @auteurs.first
    tu pourras acceder ensuite à sa collection de livres
    @auteurs.first.livres

    et réciproquement pour l'auteur du livre @livres = Livre.find_by_sql("select * from auteurs left join livres ....")
    @livres.first.auteur

    Je ne sais pas ce qu'il y a dans la clause de ta requete, mais je prefere utiliser directement les associations (tu peux y ajouter des conditions)
    et egalement je ne suis pas fan du "find_by_sql", je vais privilegier le find(id) ou le find_by_xxx(macondition)
    -> Par exemple, je suis sur la page de l'auteur id=3, @auteur = Auteur.find(3)
    j'ai directement ses livres @auteur.livres

    Trouves toi quelques tutoriels recent (je suppose en Rails 4), car tu me sembles mal parti

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 11
    Points : 11
    Points
    11
    Par défaut
    Merci,
    j'ai pu avancer grâce à tes explications.
    J'ai réussi avec le code suivant à afficher par auteur la liste des livres.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    zaut=Auteur.all
    zaut.each do |za|
        zliv=za.livres
        zliv.each do |zl|
            print za.nom, "\t", zl.titre, "\n"
        end
    end
    Il suffit ensuite d'ajouter une sélection et un tri sur zaut et zliv pour obtenir une ébauche de système de recherche.
    Ce n'est malgré tout pas très satisfaisant, car si l'on veut tous les livres contenant "terre" dans leur titre, on va balayer tous les auteurs, à moins dans zaut de faire une jointure sur les livres avec le bon titre. çà fonctionne, en remettant la même sélection sur zliv (on fait 2 fois le même travail).

    Là où je bloque, c'est que je peux vouloir cette sélection, mais classer les livres par nom d'auteur puis par titre, (ce que fait le code actuel), ou d'abord par titre puis par auteur, et là, il faudrait imbriquer la lecture des auteurs dans celle des livres.

    J'ai traité ce genre de problème avec d'autres langages grâce à du sql généré dynamiquement (la requête mettant à plat les données de toutes les tables), mais je ne vois pas comment faire avec Rails si on ne peut pas lire simultanément des données de plusieurs tables (mon essai avec find_by_sql).
    Les associations permettent-elles de faire ce genre de choses ?

  4. #4
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2011
    Messages
    239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Novembre 2011
    Messages : 239
    Points : 424
    Points
    424
    Par défaut
    D'accord, tu veux faire une recherche sur les livres et afficher le resultat de ta recherche par auteur

    on imagine que "zliv" contient ta selection, tu peux rapidement récupérer la liste des identifiants des auteurs id_auts dans une liste
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    id_auts= []
    zliv.each{|li| id_auts << li.auteur_id}
    voir quelque chose de plus complexe genre ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    zaut = {}
    zliv.each{|li| zaut[li.auteur_id] = li.auteur }
    et ensuite tu peux trier et parcourir zaut et n'en extraire que les livres selectionnés
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    zaut.each do |za|
        zliv.select{|li| li.auteur_id == za.id}.each do |zl|
            print za.nom, "\t", zl.titre, "\n"
        end
    end

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 22/03/2014, 14h24
  2. Probleme de requete qui affiche tous les champs des tables
    Par sebing dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 25/03/2011, 13h57
  3. Requête n'affiche pas les champs null
    Par souf_87 dans le forum Oracle
    Réponses: 6
    Dernier message: 04/03/2011, 17h11
  4. Récupération des commentaires sur les champs des tables.
    Par mikef32 dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 10/08/2006, 00h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo