2015-10-13 76 views
0

我一直希望你能帮我解决一直困扰我很久的问题。我有一个有票的数据库。这些票据包含状态等信息。我的应用程序使用Zendesk API从支持票据获取信息并将它们存储到我的数据库中。数据库在Rails中没有正确更新

我想要做的是将票的以前和当前状态存储到我的数据库中。我正在尝试通过在更新数据库之前存储旧值来实现此目的。起初这似乎很好。每当我改变Zendesk的状态时,我的应用程序会将previous_state更改为旧状态值,并将实际状态更改为从Zendesk收集的状态。

但是,每次刷新页面时都会出错。当发生这种情况(并且再次调用该方法)时,出于某种原因,它会将previous_state和state都放在相同的值上。我必须在我的更新或存储行中做错某些事情,但我无法弄清楚。我希望有人能帮助我。

Ticket是Ticket数据库,客户端是zendesk连接。最后一个循环检查状态和previous_status是否相同,如果是,则尝试使用zendesk将之前的状态恢复到之前的状态。这个想法是,在实际状态改变之前,以前的状态保持不变。

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 

回答

1

你的最后一个循环是行不通的,因为previousTickets不包含以前的门票,但当前的。这是因为Ticket.all只返回一个ActiveRecord关系。这就是关系加载数据的一种懒惰方式:除非您使用关系的内容,否则它不会从数据库加载。

你可以明确的关系转换到一个数组装载所有门票:

previousTickets = Ticket.all.to_a 

但我认为你可以在一个单一的循环实现的一切:不是在第一循环填充所有previous_status和恢复它最后,你应该简单地改变previous_status,当你改变当前的:

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

谢谢你,做到了!真的很感激:) – Robin