我试图找到一种在范围内设置虚拟属性的方法。背景是我有客户属于帐户。客户可以购买 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,但作用域会返回没有类别的项目列表。
答案 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)
}