数据库在Rails中无法正确更新

时间:2015-10-13 10:19:38

标签: ruby-on-rails ruby zendesk

我希望你能帮助我解决我已经坚持了一段时间的问题。我有一个带票的数据库。这些票证包含信息,如状态。我的应用程序使用Zendesk API从支持票证中获取信息并将其存储到我的数据库中。

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

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

Ticket是Ticket数据库,客户端是zendesk连接。最后一个循环检查status和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 个答案:

答案 0 :(得分: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