【问题标题】:How would you get a list of best sellers from Spree?您如何获得 Spree 的畅销书清单?
【发布时间】:2023-04-02 03:58:01
【问题描述】:

我正在开发 Spree 2.3.1,我一直在尝试根据数量获得“畅销书”列表 2 天...有什么想法吗?

到目前为止,我已经尝试使用 ActiveRecords 助手提出一个查询,我很新:

Spree::Product.includes(variants: {line_items: :order}).group('spree_products.id')

我不知道还能做什么。似乎这是开箱即用的东西。

【问题讨论】:

  • SELECT SUM(quantity), variant_id FROM "spree_line_items" INNER JOIN spree_orders ON spree_orders.id = spree_line_items.order_id WHERE spree_orders.state = 'complete' GROUP BY variant_id;

标签: ruby-on-rails activerecord spree


【解决方案1】:

这颗宝石似乎可以满足您的需求https://github.com/sylvinho81/spree_best_sellers

我从代码中提取了查询,这就是按照已售出数量的顺序获取产品列表的内容。

Spree::Product.active.select("spree_products.*, SUM(spree_line_items.quantity) as total_qty, spree_line_items.variant_id").
    joins(:line_items).joins("INNER JOIN spree_orders ON spree_orders.id = spree_line_items.order_id").
    where("spree_orders.state = 'complete'").
    group("spree_line_items.variant_id, spree_products.id").order("total_qty DESC")

【讨论】:

    【解决方案2】:

    这是我将使用的方法:

    第 1 步 - SQL/Rails 查询

    正如 Sumeet 在他的评论中所建议的那样。我会扩展查询以按日期限制订单。

    • 易于实施。
    • 数据库非常繁重。

    仅在需要时使用它,例如:很少被查看的管理面板或网站本身不那么受欢迎。

    第 2 步 - 通过添加任务以更新分类单元中的产品位置来扩展功能

    如果您想在拥有大量用户的网站上为前端用户提供最畅销的视图,那么每次用户显示产品列表时执行繁重的计数 SQL 操作并不是一个好主意。相反,您可以利用 Products 与分类单元相关的现有位置字段,从前一点执行查询并相应地更新位置。您也可以在行项目所属的分类单元范围内的每个订单之后触发位置更新。

    【讨论】:

    • 这是一个前端解决方案,所以我会记住这一点。我最终编写了原始 sql,但我使用别名来捕获总和,即 sum(line_items.quantity) 作为 total_qty。但是,我一直收到一个错误,说产品没有 total_qty 属性,但使用原始 sql 执行相同的查询有效。去图吧!
    【解决方案3】:

    您可以使用 Qwertie 为您提供的查询。您可以在 Gemfile 中添加 gem 并在代码中使用它,而不是这样做:

    宝石“spree_best_sellers”,:git => "https://github.com/sylvinho81/spree_best_sellers.git", :branch => '3-0-稳定'

    由于您使用的是 Spree 2.3.1,因此您需要调整 gem。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-03
      • 1970-01-01
      • 2011-10-19
      • 1970-01-01
      • 2021-02-18
      • 1970-01-01
      • 1970-01-01
      • 2021-08-19
      相关资源
      最近更新 更多