gpt4 book ai didi

ruby-on-rails - 通过 Rails 和 Postgresql 中对象的属性总和来限制查询

转载 作者:行者123 更新时间:2023-11-29 11:35:46 25 4
gpt4 key购买 nike

我有一个 Lead 模型,它有一个名为“sms_price”的预先计算的浮点列。我希望允许用户向这些潜在客户发送短信,并为他们的事件分配预算(类似于您在 Facebook 广告上可以找到的内容)。

我需要一个可以根据潜在客户的总价格来限制潜在客户数量的范围。因此,例如,如果用户定义了 200 的总预算

  • 编号:1 |短信价格:0.5 |总价格:0.5
  • 编号:2 |短信价格:1.2 |总价格:1.7
  • 编号:3 |短信价格:0.9 |总价格:2.6
  • ...
  • 编号:94 |短信价格:0.8 | total_price: 199.4 <--- 在此停止查询
  • 编号:95 |短信价格:0.7 |总价格:200.1

所以我需要在我的范围内做两件事:

  1. 递归计算总价
  2. 仅获取总价低于所需预算的潜在客户

到目前为止,我只设法使用此范围完成了第一个任务(递归计算总价):

scope :limit_by_total_price, ->{select('"leads".*, sum(sms_price) OVER(ORDER BY id) AS total_price')}

这有效,如果我执行 Lead.limit_by_total_price.last.total_price 我会得到 38039.7499999615

现在我需要的是一种只检索总价低于预算的线索的方法:

scope :limit_by_total_price, ->(budget){select('"leads".*, sum(sms_price) OVER(ORDER BY id) AS total_price').where('total_price < ?', budget)}

但它不识别 total_price 属性:

ActiveRecord::StatementInvalid: PG::UndefinedColumn: ERROR:  column "total_price" does not exist

为什么它识别单个对象中的 total_price 属性而不是范围中的?

最佳答案

问题是在 SELECT 子句中计算的列对同一语句中的 WHERE 子句不可用。要执行您想要的操作,您需要一个子查询。

您可以使用 ActiveRecord 的 from 执行此操作并留在 Rails 世界中方法。 this Hashrocket blog post 中很好地说明了该技术.

在您的情况下,它可能看起来像这样(由于复杂性,我会使用类方法而不是范围):

def self.limit_by_total_price(budget)
subquery = select('leads.*, sum(leads.sms_price) over(order by leads.id) as total_price')
from(subquery, :leads).where('total_price < ?', budget)
end

关于ruby-on-rails - 通过 Rails 和 Postgresql 中对象的属性总和来限制查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53503496/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com