0

我正在尝试设置一个范围查询,我可以在其中找到已支付(或部分支付)发票的客户。

但是,我想在范围中使用的值实际上并不在数据库中,它是一种方法。

例如:

投标人.rb

class Bidder < ActiveRecord::Base
  ...

  scope :unpaid, where(payment_status: 'unpaid')

  ...

  def payment_status
    "paid" if whatever
    "partial" if whatever
    "unpaid" if whatever
  end
  ...
end

当我尝试使用时:

@auction.bidders.unpaid

我看到这个:

SQLite3::SQLException: no such column: bidders.payment_status: SELECT COUNT(*) FROM "bidders"  WHERE "bidders"."auction_id" = 7 AND "bidders"."payment_status" = 'unpaid'

我需要改变什么才能让这样的事情起作用?我什至应该使用范围吗?

另外,如何更改该范围以搜索“未付费”和“部分”值?

谢谢

4

1 回答 1

0

您可以像这样使用范围:

scope :unpaid, all.select{ |bidder| bidder.payment_status == 'unpaid' }

这样,您将拥有一组未付费投标者,但如果您想链接方法,则必须将该数组转换为如下关系:

scope :unpaid, where(id: all.select{ |bidder| bidder.payment_status == 'unpaid' }.map(&:id))

看到您正在急切地访问数据库,您可能希望将 payment_status 作为性能的计算值。

于 2013-05-13T20:08:51.747 回答