Ruby on rails 在作用域中设置虚拟属性

Ruby on rails 在作用域中设置虚拟属性,ruby-on-rails,scope,virtual-attribute,Ruby On Rails,Scope,Virtual Attribute,我试图找到一种在作用域中设置虚拟属性的方法。背景是我有属于客户的客户。客户可以购买salesitems。我有一个表customers\u salesitem,显示哪些客户过去购买过哪些商品 我想生成一个salesitems列表,其中包含一个附加字段“category”,该字段将salesitems分类为客户已购买的salesitems、其他客户从同一帐户购买的salesitems和帐户上任何人未购买的salesitems。最后,我想使用范围来创建一个自动完成字段,但目前这有点不合适 我尝试了以下

我试图找到一种在作用域中设置虚拟属性的方法。背景是我有属于客户的客户。客户可以购买salesitems。我有一个表customers\u salesitem,显示哪些客户过去购买过哪些商品

我想生成一个salesitems列表,其中包含一个附加字段“category”,该字段将salesitems分类为客户已购买的salesitems、其他客户从同一帐户购买的salesitems和帐户上任何人未购买的salesitems。最后,我想使用范围来创建一个自动完成字段,但目前这有点不合适

我尝试了以下几点:

class Salesitem < ActiveRecord::Base
    has_many :customers_salesitems

    scope :previous_customer_purchase, lambda {
        |customer|
        select("*").
        select("'Previous Customer Purchase' as category").
        where ("salesitems.id IN (SELECT customers_salesitems.salesitem_id FROM customers_salesitems WHERE customer_id = ?)",
            customer.id)          
    }

    def category
        @category
    end

    def category=(value)
        @category = @attributes["category"] = value
    end
end

尽管SQL已正确生成,但作用域返回一个没有类别的项列表。

尽管where方法和其他一些新的Rails 3查询方法可以通过累积影响进行链接,但有些方法不会合并。我认为select方法不能合并。不幸的是,这些新功能中的很多都没有很好的文档记录。select的文档是

select(value = Proc.new)
我想你需要的是:

scope :previous_customer_purchase, lambda {
    |customer|
    select("*, 'Previous Customer Purchase' as category").
    where ("salesitems.id IN (SELECT customers_salesitems.salesitem_id FROM customers_salesitems WHERE customer_id = ?)",
        customer.id)          
}