Rails范围不使用SQL

时间:2013-05-13 19:52:18

标签: ruby-on-rails ruby-on-rails-3

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

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

例如:

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'

我需要做些什么才能让这样的事情发挥作用?我应该使用示波器吗?

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

由于

1 个答案:

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