2015-10-13 68 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