在作用域中设置虚拟属性

时间:2012-04-20 18:55:51

标签: ruby-on-rails scope virtual-attribute

我试图找到一种在范围内设置虚拟属性的方法。背景是我有客户属于帐户。客户可以购买 salesitems 。我有一个表customers_salesitem,显示哪些客户过去购买了哪些商品。

我想生成一个salesitems列表,其中包含一个额外的字段'category',用于将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,但作用域会返回没有类别的项目列表。

1 个答案:

答案 0 :(得分:0)

虽然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)          
}