0

スコープに仮想属性を設定する方法を見つけようとしています。背景は、アカウントに属する顧客がいます。顧客は販売アイテムを購入できます。過去にどの顧客がどの商品を購入したかを示すテーブル customers_salesitem があります。

販売アイテムを、顧客が購入したもの、同じアカウントの別の顧客が購入したもの、および購入していないものに分類する追加フ​​ィールド「カテゴリ」を使用して、販売アイテムのリストを生成したいと思います。アカウントの誰でも購入できます。最終的には、スコープをオートコンプリート フィールドに使用したいのですが、現時点では少しずれています。

私は次の行に沿っていくつかのことを試しました:

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 は正しく生成されますが、スコープはカテゴリのないアイテム リストを返します。

4

1 に答える 1

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)          
}
于 2012-04-21T15:32:01.243 に答える