我正在尝试设置范围查询,以便找到已支付(或部分支付)发票的客户。
但是,我想在范围中使用的值实际上并不在数据库中,而是一种方法。
例如:
Bidder.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'
我需要做些什么才能让这样的事情发挥作用?我应该使用示波器吗?
另外,如何更改该范围以搜索“未付”和“部分”值?
由于
答案 0 :(得分: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作为性能的计算值。