微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在会话中存储和使用多个cart_ids

如何解决如何在会话中存储和使用多个cart_ids

我希望有人能指出我正确的方向,因为这几天我一直在思考这个问题?。

一个网站列出了多个商店,每个商店都有一个展示页面用户可以从中选择产品并将其添加到(会话)购物车中。每家商店都有相应的购物车。用户对每个购物车执行单独的结帐过程。在carts#index 页面上,用户可以看到活动购物车的概览。

我发现以下代码段完全有效。然而,当尝试升级 set_cart 方法以包含多个购物车时,我自己的逻辑和想法失败了。

module CurrentCart
  private

  def set_cart
    @cart = Cart.find(session[:cart_id])
  rescue ActiveRecord::RecordNotFound
    @cart = Cart.create
    session[:cart_id] = @cart.id
  end
end

一种有效但不是很可扩展的方法是为整个网站创建 1 个会话购物车,然后发送一个商店实例进行过滤(即@cart.items_for_shop(@shop))。问题在于购物车实例和商店实例都需要在应用的任何地方都可用。为每个商店设置单独的 cart_id 会更有意义。

您将如何在会话中存储多个购物车?

非常感谢?

解决方法

我可能会选择使用 ParentCart 或 MetaCart,或者任何你想称之为每个商店的所有购物车都属于的东西。对于此示例,让我们使用 UberCart

因此,您的 set_cart 方法会查找或创建 UberCart 记录,这与您当前对普通 Cart 所做的完全一样。

接下来,对于每个商店,无论是在您创建 UberCart 时,还是在稍后查看商店时……由您决定,您都可以创建一个 Cart,它本质上是一个连接表在您的 UberCart 和所选的 Shop 之间。

然后将来自 LineItem

Shop 附加到正确的 Cart,该 UberCart 可从您会话中的 CartController#index 访问。

在您的 @uber_cart.carts 操作中,您只需使用 UberCart 即可访问属于此 private var postsCollectionView: UICollectionView? override func viewDidLoad() { super.viewDidLoad() ... initializePosts() } func initializePosts() { let layout = UICollectionViewFlowLayout() layout.scrollDirection = .vertical layout.itemSize = CGSize(width: 380,height: 285) layout.sectionInset = UIEdgeInsets(top: 0,left: 0,bottom: 0,right: 0) layout.minimumLineSpacing = 30 postsCollectionView = UICollectionView(frame: .zero,collectionViewLayout: layout) postsCollectionView?.register(PostCell.self,forCellWithReuseIdentifier: PostCell.identifier) postsCollectionView?.showsHorizontalScrollIndicator = false postsCollectionView?.showsVerticalScrollIndicator = false postsCollectionView?.contentInsetAdjustmentBehavior = .always postsCollectionView?.delegate = self postsCollectionView?.dataSource = self postsCollectionView?.backgroundColor = .blue guard let postsCollections = postsCollectionView else { return } view.addSubview(postsCollections) } ... override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() postsCollectionView?.frame = CGRect(x: 0,y: 330,width: view.frame.size.width,height: view.frame.size.height).integral } 的所有购物车。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。