我有三个作用域: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 }
请更清楚地描述你的模型和你想做什么优化。
谢谢