2015-10-13 1 views
0

J'espérais que vous pourriez m'aider avec un problème que je suis resté bloqué pendant un bon moment maintenant. J'ai une base de données avec des tickets. Ces tickets contiennent des informations, comme un statut. Mon application utilise l'API Zendesk pour obtenir des informations à partir des tickets de support et les stocker dans ma base de données.Base de données ne se met pas correctement à jour dans Rails

Ce que je veux faire est de stocker l'état précédent et actuel d'un ticket dans ma base de données. J'essaye d'accomplir ceci en stockant les vieilles valeurs avant de mettre à jour ma base de données. Au début, cela semblait fonctionner très bien. Chaque fois que je change l'état dans Zendesk, mon application change le previous_state en l'ancien état et l'état actuel en celui qu'il recueille de Zendesk.

Cependant, il se passe mal chaque fois que j'actualise ma page. Lorsque cela se produit (et que la méthode est appelée à nouveau), pour une raison quelconque, elle met à la fois le paramètre previous_state et l'état sur la même valeur. Je dois faire quelque chose de mal dans une de mes lignes de mise à jour ou de magasin mais je ne peux pas comprendre quoi. J'espère que quelqu'un d'entre vous peut m'aider.

Ticket est la base de données de tickets, le client est la connexion zendesk. La dernière boucle vérifie si le status et previous_status sont identiques et si c'est le cas, essaie de remettre l'état précédent à l'état précédent avant la grosse mise à jour avec zendesk. L'idée est que l'état précédent reste inchangé jusqu'à ce que l'état actuel change.

previousTickets = Ticket.all 

Ticket.all.each do |old| 
    old.update(:previous_status => old.status) 
end 

client.tickets.each do |zt| 
    Ticket.find_by(:ticket_id => zt.id).update(
    subject: zt.subject, 
    description: zt.description, 
    ticket_type: zt.type, 
    status: zt.status, 
    created: zt.created_at, 
    organization_id: zt.organization_id, 
    ) 
end 

Ticket.all.each do |newTicket| 
    if(newTicket.status == newTicket.previous_status) 
    b = previousTickets.find_by(:ticket_id => newTicket.ticket_id) 
    c = b.previous_status 
    newTicket.update(:previous_status => c) 
    end 
end 

Répondre

1

Votre dernière boucle ne fonctionne pas parce que previousTickets ne contient pas de billets précédents, mais les actuels. Cela est dû au fait que Ticket.all renvoie uniquement une relation ActiveRecord. Cette relation charge les données de manière paresseuse: à moins d'utiliser le contenu de la relation, elle ne sera pas chargée depuis la base de données.

Vous pouvez explicitement charger tous les billets en convertissant la relation à un tableau:

previousTickets = Ticket.all.to_a 

Mais je pense que vous pourriez réaliser tout en une seule boucle: au lieu de peupler tous previous_status dans la première boucle et revenir en le dernier, il vous suffit de changer le previous_status lorsque vous modifiez l'actuel:

client.tickets.each do |zt| 
    ticket = Ticket.find_by(:ticket_id => zt.id) 
    previous_status = ticket.previous_status 
    previous_status = ticket.status if zt.status != ticket.status 
    ticket.update(
    subject: zt.subject, 
    description: zt.description, 
    ticket_type: zt.type, 
    previous_status: previous_status, 
    status: zt.status, 
    created: zt.created_at, 
    organization_id: zt.organization_id, 
) 
end 
+0

Merci homme, qui l'a fait! J'apprécie beaucoup :) – Robin