2013-05-13 55 views
0

我试图设置作用域查询,我可以在其中找到已支付(或部分支付)发票的客户。未使用SQL的Rails作用域

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

例如:

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

提供模型的更多细节。这里'payment_status'是一个内部实例方法,而不是SQL在调用一个范围时可以组织的属性。 – kiddorails 2013-05-13 19:57:20

+0

这就是为什么我问我是否应该使用'范围'。我想缩小搜索范围的方法是通过从非db数据进行筛选。 – 2013-05-13 20:02:38

回答

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作为性能的计算值。

+0

嗯。当使用其中任何一种方法时,我会为#<投标人:0x007f85dcd885d8>'获取'未定义的方法'payment_status'。 – 2013-05-13 22:18:40

+0

“Bidder.first.payment_status”或“Bidder.new.payment_status”输出是什么? – juanpastas 2013-05-13 23:06:32

+0

按预期返回结果。 ''付费''和''n/a“'分别。 – 2013-05-13 23:16:32