Ruby on rails 通过Rails和Postgresql中对象的属性之和限制查询

Ruby on rails 通过Rails和Postgresql中对象的属性之和限制查询,ruby-on-rails,postgresql,activerecord,ruby-on-rails-5,Ruby On Rails,Postgresql,Activerecord,Ruby On Rails 5,我有一个潜在客户模型,它有一个预先计算的浮动列,名为“sms_price”。我想允许用户向这些潜在客户发送短信,并为他们的活动分配预算(类似于你在fb广告上看到的) 我需要一个范围,可以限制这些线索的总价格的线索数量。例如,如果用户定义的总预算为200 id:1 |短信价格:0.5 |总价:0.5 id:2 |短信价格:1.2 |总价:1.7 id:3 |短信价格:0.9 |总价:2.6 id:94 | sms|U price:0.8 | total|U price:199.4问题在于SEL

我有一个潜在客户模型,它有一个预先计算的浮动列,名为“sms_price”。我想允许用户向这些潜在客户发送短信,并为他们的活动分配预算(类似于你在fb广告上看到的)

我需要一个范围,可以限制这些线索的总价格的线索数量。例如,如果用户定义的总预算为200

  • id:1 |短信价格:0.5 |总价:0.5
  • id:2 |短信价格:1.2 |总价:1.7
  • id:3 |短信价格:0.9 |总价:2.6

  • id:94 | sms|U price:0.8 | total|U price:199.4问题在于SELECT子句中计算的列对同一语句中的WHERE子句不可用。要执行所需操作,需要一个子查询

    您可以使用ActiveRecord的方法做到这一点,但仍然可以留在Rails世界中。中很好地说明了该技术

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

    def self.limit\u by\u总价(预算)
    子查询=选择('leads.*,合计(leads.sms\u price)超过(order by leads.id)作为总价')
    from(子查询:leads)。其中('总价<?',预算)
    结束
    
    请参见:
    scope :limit_by_total_price, ->{select('"leads".*, sum(sms_price) OVER(ORDER BY id) AS total_price')}
    
    scope :limit_by_total_price, ->(budget){select('"leads".*, sum(sms_price) OVER(ORDER BY id) AS total_price').where('total_price < ?', budget)}
    
    ActiveRecord::StatementInvalid: PG::UndefinedColumn: ERROR:  column "total_price" does not exist
    
    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