【问题标题】:OPTIMIZE QUERY ON RAILS - POSTGRESQL优化 Rails 上的查询 - POSTGRESQL
【发布时间】:2022-11-08 09:39:05
【问题描述】:

我有 3 个范围: 1 - 列出正在进行的促销活动。 2 - 最后排序缺货 3 - 列出未进行的促销活动。

是否可以将所有内容组合在一个范围内?它将是:按库存从高到低的顺序列出正在进行的促销活动,然后是未进行的促销活动。

我试过了,但我做不到。

scope :in_progress, -> { start_and_end_dates.in_weeks.between_hours }
    
scope :without_stock_last, lambda {
  select('promotions.*, (CASE WHEN offers.current_inventory > 0 THEN 1 ELSE 0 END) AS "is_available"')
   .order('is_available DESC')
   .group('promotions.id, offers.current_inventory, offers.created_at')
}
    
scope :not_progress, lambda {
  promotions_in_progress = Promotion.in_progress.pluck(:id).join(",")
  Promotion.with_estabilishment.select("promotions.*, (CASE WHEN promotions.id NOT IN (#{promotions_in_progress}) THEN 0 END) AS is_unavailable")
  .order('is_unavailable DESC')
}

【问题讨论】:

  • 第一个范围甚至不起作用?没有连接,因此它不可能从promotionsoffers 表中选择列。如果没有很好地描述代码应该做什么、数据示例和预期输出,就不可能优化代码。见鬼,你甚至没有向我们展示这段代码属于什么模型。
  • “我试过了,但我做不到。”是幼儿说的——不是程序员。告诉我们您实际尝试了什么,什么没有奏效,这样我们至少有一个起点并知道您遇到了什么困难。 idownvotedbecau.se/noattempt

标签: ruby-on-rails ruby postgresql ruby-on-rails-3


【解决方案1】:

如果我理解你想要做的是让 in_progress 首先显示在结果中,然后你有没有进行中的下一个。您可以像:find_all 的范围一样连接其他两个结果的结果。

我认为(如果我错了,请纠正我)你在促销和优惠之间有一对多的关系。所以我在without_stock_last 范围内所做的是加入报价并设置 current_inventory 大于 2 的条件。

对于not_in_progress,您只需执行 where.not 即可排除来自in_progress scope 的结果

scope :in_progress, -> { start_and_end_dates.in_weeks.between_hours }
scope :without_stock_last, -> { joins(:offfers).where(offers: {current_inventory: 2..})  }
scope :not_in_progress, -> { where.not(id: in_progress) }
scope :find_all, -> { without_stock_last + not_in_progress }

请更清楚地描述您拥有的模型以及您想要进行的优化。

感谢

【讨论】:

    猜你喜欢
    • 2014-06-13
    • 2022-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-12
    • 1970-01-01
    • 2018-02-07
    • 1970-01-01
    相关资源
    最近更新 更多