2017-04-20 2 views
0

Je me suis creusé le cerveau toute la journée et je n'arrive pas à le faire fonctionner. Je suis très nouveau à Ruby et rails ainsi mes excuses pour toutes les erreurs stupides.Active Record Table Jointures

Mon problème est de joindre 3 tables pour obtenir un objet @students. Cela fonctionne mais si j'appelle par exemple @ student.name alors 'name' n'existe pas.

Ci-dessous mon code:

contrôleur note que j'ai essayé d'utiliser .includes et .join et le même problème se produit.

class MyprojectController < ApplicationController 
    def show 
    @project = Project.find(params[:id]) 
    @dateformat = '%b %e - %H:%M' 
    @user = Student.includes("INNER JOIN researchers ON students.researcher_id = researchers.id 
           INNER JOIN users ON researchers.user_id = users.id").where('user_id = ?', current_user.id) 

end 

Modèle utilisateur

class User < ApplicationRecord 
    include EpiCas::DeviseHelper 

    has_many :event_registrations 
    has_many :events, through: :event_registrations 
    belongs_to :project 
    has_many :researchers 
    #has_many :students, :through => :researchers 
    #has_many :supervisors, :through => :researchers 

    # def self.authenticate(username) 
    # where(username: username).first 
    # end 

fin

Modèle de chercheur

class Researcher < ApplicationRecord 
    #belongs_to :project 
    belongs_to :user 
    has_many :supervisor 
    has_many :students 
end 

Modèle étudiantDonc, chaque étudiant a un ID chercheur et chaque chercheur a un id_utilisateur. Donc les jointures devraient aller à student-> researcher-> user et ensuite je veux pouvoir utiliser tous les attributs de toutes les tables dans un objet @user. J'ai essayé d'utiliser Student.join (: researcher,: user) mais j'ai essayé de faire une jointure de la table Student vers la table des chercheurs, puis j'ai essayé de rejoindre la table utilisateur en utilisant un user_id de la table des étudiants (mais de user_id est dans la table du chercheur). Donc, je viens de faire la requête moi-même.

Toutes les données semblent être présentes mais en tant que 'attributs bruts'.

Toute aide serait grandement appréciée!

-James

+0

Lorsque vous faites plusieurs jointures dans ActiveRecord, alors il devient un peu loufoque d'accéder aux données. Il se peut que vous deviez y accéder via '@student [" nom "]' au lieu de la façon habituelle. – octopushugs

+0

merci @octopushugs et je pense que vous êtes dans le bon sens mais cela n'a pas fonctionné :( –

Répondre

1

Plutôt que d'essayer de joindre les choses dans un retour (comme vous le feriez dans sql) utiliser includes afin que vous puissiez accéder à toutes vos données en moins de requêtes, mais vous avez toujours accès à vos données dans les objets. Le point d'utiliser un ORM comme ActiveRecord est de pouvoir accéder à vos données en utilisant des objets. L'inconvénient de l'utilisation d'un ORM est que, parfois, il n'est pas aussi efficace pour vous obtenir les données exactes que vous voulez, parce que les données poussent dans les objets. L'utilisation de includes fournit une sorte de terrain d'entente où vous pouvez accéder aux données dont vous avez besoin dans les objets et vous n'avez pas nécessairement besoin d'exécuter des requêtes pour chaque association.

Essayez quelque chose comme (selon la façon dont vous obtenez votre nom d'utilisateur - Je suppose du projet):

@user = User.includes(researcher: :student).find(project.user_id)

Et puis vous pouvez accéder à des choses à travers les rails normaux associations:

researcher = @user.researcher

student = researcher.student

J'espère que aide et bonne chance!

+0

Juste essayé ceci et cela ne fonctionne toujours pas malheureusement. D'abord il est capable de trouver le chercheur du chercheur = @ user.researcher mais alors Je n'arrive toujours pas à trouver des étudiants de l'étudiant = chercheur.étudiant Deuxièmement, même sans créer ces objets chercheur et étudiant, je suis toujours incapable d'accéder aux attributs de la section utilisateur Merci pour votre aide si –

+0

Une autre solution possible est de faire les «jointures» comme vous le faites maintenant, mais lancez un manuel 'select' sur les champs dont vous avez besoin et reliez-les, comme' select ("users.name as user_name") ', alors vous devriez être en mesure d'obtenir les morceaux que vous voulez – octopushugs

+0

Est-ce que le problème sous-jacent ici est que les associations de rails ne se chargent pas comme prévu? Peut-être que votre schéma sql n'est pas configuré correctement Vous pouvez charger un objet utilisateur et accéder à ses associations en om la console des rails? (lance 'bin/rails console' pour entrer dans la console). À partir de la console des rails, vous devriez être capable de créer différents modèles et associations pour vérifier que tout est en train d'enregistrer dans la base de données comme vous le souhaitez. – Puhlze