Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何在函数而不是数据库列上运行where子句?_Ruby On Rails_Ruby_Ruby On Rails 3_Activerecord - Fatal编程技术网

Ruby on rails 如何在函数而不是数据库列上运行where子句?

Ruby on rails 如何在函数而不是数据库列上运行where子句?,ruby-on-rails,ruby,ruby-on-rails-3,activerecord,Ruby On Rails,Ruby,Ruby On Rails 3,Activerecord,在我的发票模型中,我正在尝试获取所有未付发票: class Invoice < ActiveRecord::Base has_many :payments def self.outstanding where("outstanding_amount != 0") end private def outstanding_amount total - payments.to_a.sum(&:amount_in_cents) end en

在我的
发票
模型中,我正在尝试获取所有未付发票:

class Invoice < ActiveRecord::Base

  has_many :payments

  def self.outstanding
    where("outstanding_amount != 0")
  end

  private

  def outstanding_amount
    total - payments.to_a.sum(&:amount_in_cents)
  end

end
class发票
但是,这不起作用,因为我没有数据库列
未付金额
。有没有办法对函数而不是数据库字段运行
where
子句


谢谢您的帮助。

您需要将表达式作为having子句的一部分传递。对于活动记录语法,我将遵从RoR向导,但您的最终查询应该是:

select ...
from ... join payments on ...
where ...
group by ...
having total != sum(payments.amount)
如果大多数行不平衡(不太可能),另一种选择是相关子查询:

select ...
from ...
where ...
and total != (select sum(amount) from payment where ...)
(如果大多数行不平衡,请不要执行上述操作,因为性能会很差。)

最后一种选择(我实际上建议)是维护一个
paid
列——理想情况下,尽管不一定要使用触发器。然后,您可以使用:

select ...
from ...
where ...
and total != paid
更好的是,您可以将后者改写为:

where total - paid != 0

然后在
(total-paid)上添加部分索引,其中(total-paid!=0)
,以获得最佳性能。

您需要将表达式作为having子句的一部分传递。对于活动记录语法,我将遵从RoR向导,但您的最终查询应该是:

select ...
from ... join payments on ...
where ...
group by ...
having total != sum(payments.amount)
如果大多数行不平衡(不太可能),另一种选择是相关子查询:

select ...
from ...
where ...
and total != (select sum(amount) from payment where ...)
(如果大多数行不平衡,请不要执行上述操作,因为性能会很差。)

最后一种选择(我实际上建议)是维护一个
paid
列——理想情况下,尽管不一定要使用触发器。然后,您可以使用:

select ...
from ...
where ...
and total != paid
更好的是,您可以将后者改写为:

where total - paid != 0

然后在
(total-paid)上添加部分索引,其中(total-paid!=0)
,以获得最佳性能。

您需要将表达式作为having子句的一部分传递。对于活动记录语法,我将遵从RoR向导,但您的最终查询应该是:

select ...
from ... join payments on ...
where ...
group by ...
having total != sum(payments.amount)
如果大多数行不平衡(不太可能),另一种选择是相关子查询:

select ...
from ...
where ...
and total != (select sum(amount) from payment where ...)
(如果大多数行不平衡,请不要执行上述操作,因为性能会很差。)

最后一种选择(我实际上建议)是维护一个
paid
列——理想情况下,尽管不一定要使用触发器。然后,您可以使用:

select ...
from ...
where ...
and total != paid
更好的是,您可以将后者改写为:

where total - paid != 0

然后在
(total-paid)上添加部分索引,其中(total-paid!=0)
,以获得最佳性能。

您需要将表达式作为having子句的一部分传递。对于活动记录语法,我将遵从RoR向导,但您的最终查询应该是:

select ...
from ... join payments on ...
where ...
group by ...
having total != sum(payments.amount)
如果大多数行不平衡(不太可能),另一种选择是相关子查询:

select ...
from ...
where ...
and total != (select sum(amount) from payment where ...)
(如果大多数行不平衡,请不要执行上述操作,因为性能会很差。)

最后一种选择(我实际上建议)是维护一个
paid
列——理想情况下,尽管不一定要使用触发器。然后,您可以使用:

select ...
from ...
where ...
and total != paid
更好的是,您可以将后者改写为:

where total - paid != 0

然后在
(total-paid)上添加部分索引,其中(total-paid!=0)
,以获得最佳性能。

您可以将搜索条件作为参数传递,并让该方法处理它。但在您的情况下,如果您只输入:
def self.navergent\u amount==0,情况会不会一样?nil:naverted_amount end
您可以将搜索条件作为参数传递,并让方法处理它。但在您的情况下,如果您只输入:
def self.navergent\u amount==0,情况会不会一样?nil:naverted_amount end
您可以将搜索条件作为参数传递,并让方法处理它。但在您的情况下,如果您只输入:
def self.navergent\u amount==0,情况会不会一样?nil:naverted_amount end
您可以将搜索条件作为参数传递,并让方法处理它。但在您的情况下,如果您只输入:
def self.navergent\u amount==0,情况会不会一样?无:未付金额结束
感谢您的精彩报道。事实上,我现在正在发票表中使用一个
已付
列(在我的情况下,它实际上被称为
未付金额
)。我希望有一天能够取消该列,因为正如您正确指出的,无论何时保存新发票或付款记录,都需要维护该列。但你让我相信保留那个专栏可能更好。似乎真的没有其他方法可以做到这一点。你是对的,但你应该花更多的时间在你的答案上,并添加完整的sql查询(没有“…”)+1@SergeyKutsko:同意,但OP未提供架构。:-)谢谢你的精彩评论。事实上,我现在正在发票表中使用一个
已付
列(在我的情况下,它实际上被称为
未付金额
)。我希望有一天能够取消该列,因为正如您正确指出的,无论何时保存新发票或付款记录,都需要维护该列。但你让我相信保留那个专栏可能更好。似乎真的没有其他方法可以做到这一点。你是对的,但你应该花更多的时间在你的答案上,并添加完整的sql查询(没有“…”)+1@SergeyKutsko:同意,但OP未提供架构。:-)谢谢你的精彩评论。事实上,我现在正在发票表中使用一个
已付
列(在我的情况下,它实际上被称为
未付金额
)。我希望有一天能够取消该列,因为正如您正确指出的,无论何时保存新发票或付款记录,都需要维护该列。但你让我相信保留那个专栏可能更好。似乎真的有