如何在会话结束前删除Cart和LineItems?

时间:2019-05-05 08:16:17

标签: ruby-on-rails ruby-on-rails-5

我正在按照本教程在我的Ecomerce应用中制作购物车: https://richonrails.com/articles/building-a-shopping-cart-in-ruby-on-rails 一切都很好,但是当会话结束和客户未完成订单时,此订单和订单项仍保存在数据库中。 我的想法是使用回调方法before_destroy会话购物车,但我不知道到底是哪种方法销毁会话 谁能帮我吗?

1 个答案:

答案 0 :(得分:0)

不幸的是,回调方法将很困难,因为您不知道会话何时结束,因为网站是无状态的。换句话说,您永远不会真正知道访客是否只是闲着,还是实际上离开了。通常,您收到的唯一标志是请求(GET / POST / PATCH / ..)。

要做到这一点,您可以做的是检查last_updated值,并假设两个小时后删除所有未确认的购物车。或者,您甚至可以做一天,因为谁在乎呢?在您的数据库中只有几个字节。

要完成这项工作,您可以编写一个rake任务,查询并删除所有废弃的购物车。

类似的东西:

# cart model
class Cart
   scope :unconfirmed { where(bought: false) }
   scope :abandoned, { unconfirmed.where('last_update < ?', 1.day.ago} 
end

# rake task
namespace :maintenance do
  task delete_abandoned_carts: :environment do
    Cart.abandoned.destroy_all
  end
end

在此处了解有关耙任务的更多信息:https://guides.rubyonrails.org/command_line.html#custom-rake-tasks