2017-09-01 3 views
0

J'ai deux tables qui a beaucoup à manyRails données variables est en train de changer

étudiants projets

reliés par la table student_projects

student = Student.find(1) 
old_projects = student.projects 

#Now Iam calling function that will create projects 
create_projects 

student = Student.find(1) 
new_projects = student.projects 
newly_added_projects = new_projects - old_projects 

Les anciens projets étaient vides, ne sont pas new_projects

Je mets l'instruction logger avant de créer et après la ligne (new_projects = students.projects), alors je peux voir le di férence.

Mais quand je mets la déclaration de l'enregistreur uniquement après la ligne (newly_added_projects = new_projects - old_projects) inspectant old_projects, new_projects, newly_added_projects

alors old_projects est égal à new_projects

quelqu'un peut me aider dans ce

+2

Rails tente de différer l'accès à la base de données jusqu'à ce que les données soient réellement nécessaires. Je ne suis pas sûr de savoir comment se comporte Rails 3, mais je suppose que 'old_projects = student.projects' ne retourne pas un tableau, mais une sorte de proxy. Et que les deux requêtes sont exécutées en invoquant '-' (donc les deux retournent le même résultat). Essayez d'appliquer la requête en ajoutant un 'to_a', c'est-à-dire' old_projects = student.projects.to_a' – Stefan

+0

Quelle est la version de Rails que vous utilisez? – Mohanraj

+0

Stefan - Merci cela fonctionne –

Répondre

1

Je vous suggère de recueillir le projet ids avant et après la création de nouveaux projets et soustrayez les IDs des anciens ids de projets et de nouveaux ids de projet comme ci-dessous,

student = Student.find(1) 
old_project_ids = student.projects.map(&:id) # You may use student.project_ids 

#Now Iam calling function that will create projects 
create_projects 

student = Student.find(1) 
new_project_ids = student.projects.map(&:id) 
newly_added_project_ids = new_project_ids - old_project_ids 

vous pouvez Else convertir les old_projects objet de relation d'enregistrement actif à un tableau ruby ​​simple comme ci-dessous,

student = Student.find(1) 
old_projects = student.projects.to_a 

#Now Iam calling function that will create projects 
create_projects 

student = Student.find(1) 
new_projects = student.projects_to_a 
newly_added_projects = new_projects - old_projects 
+0

Vous devriez utiliser 'pluck (: id)' si vous êtes simplement intéressé par les identifiants. – Stefan

+0

Oui, nous pouvons utiliser le pinceau. Merci. – Mohanraj

-1
student = Student.find(1) 
old_projects = student.projects 

newly_added_projects = create_projects # return newly projects from method itself. 

def create_projects 
    projects = [] 

    #add newly created projects in projects array and return at the end. 
    return projects 
end 

Faites quelque chose comme ça. Pas besoin de le calculer depuis l'origine vous avez déjà des projets dans votre méthode create_projects.

+0

Cela n'a rien à voir avec un problème, que @Stefan a expliqué dans le commentaire est liée à l'exécution différée de la requête SQL. – mudasobwa