数据库未在 Rails 中正确更新
Database not updating correctly in Rails
我希望你能帮助我解决一个我已经困扰了很长时间的问题。我有一个带有门票的数据库。这些票证包含状态等信息。我的应用程序使用 Zendesk API 从支持票中获取信息并将其存储到我的数据库中。
我想做的是将工单的先前和当前状态存储到我的数据库中。我试图通过在更新数据库之前存储旧值来实现这一点。起初这似乎很管用。每当我在 Zendesk 中更改状态时,我的应用程序都会将 previous_state 更改为旧状态值,并将实际状态更改为它从 Zendesk 收集的状态。
但是,每当我刷新页面时,它就会出错。当这种情况发生时(并且该方法被再次调用),由于某种原因它会将 previous_state 和 state 置于相同的值上。我一定是在我的一个更新或商店行中做错了什么,但我不知道是什么。希望大家能帮帮我。
Ticket是Ticket数据库,client是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
您的最后一个循环无效,因为 previousTickets
不包含以前的票证,而是当前的票证。这是因为 Ticket.all
returns 只是一个 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
我希望你能帮助我解决一个我已经困扰了很长时间的问题。我有一个带有门票的数据库。这些票证包含状态等信息。我的应用程序使用 Zendesk API 从支持票中获取信息并将其存储到我的数据库中。
我想做的是将工单的先前和当前状态存储到我的数据库中。我试图通过在更新数据库之前存储旧值来实现这一点。起初这似乎很管用。每当我在 Zendesk 中更改状态时,我的应用程序都会将 previous_state 更改为旧状态值,并将实际状态更改为它从 Zendesk 收集的状态。
但是,每当我刷新页面时,它就会出错。当这种情况发生时(并且该方法被再次调用),由于某种原因它会将 previous_state 和 state 置于相同的值上。我一定是在我的一个更新或商店行中做错了什么,但我不知道是什么。希望大家能帮帮我。
Ticket是Ticket数据库,client是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
您的最后一个循环无效,因为 previousTickets
不包含以前的票证,而是当前的票证。这是因为 Ticket.all
returns 只是一个 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