在RAILS - POSTGRESQL上优化查询



我有三个作用域: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')
}

如果我明白你想做的是让in_progress首先显示在结果中,然后你有不在进行中接下来。您可以将作用域:find_all与其他两个作用域的结果连接起来。

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

对于not_in_progress,你可以只做一个where。不从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 }

请更清楚地描述你的模型和你想做什么优化。

谢谢

相关内容

  • 没有找到相关文章

最新更新