2011-12-10 16 views
0

findメソッドはレコードの検索に非常に便利で、頻繁に使用されます:参照するレコードをプリフェッチして高価なdbアクセスを避ける。データベースの検索を避けるためにハッシュの配列を検索する

営業担当者がすべての売上を検索するケースがあります。

@sales = Sales.find(:all, 
        :include => [:salesperson, :customer, :batch, :product], 
        :conditions => {:salesperson_id => someone}, 
        :order => :customer_id) 

返されたレコードに基づいて、返されたレコードをスライスして切り取りたいとします。たとえば、この営業担当者が特定の店舗で行ったすべての販売に関するレポートを作成するとします。これは、以前に返されたデータのサブセットです。

私がやってみたい何

@storeSales = @sales.find_by_store(store_id) 
...と、新しい配列としてメモリに保持配列からこのサブセットを取得するのではなく、上の検索を実行することによって、同じことを達成データベースを再度作成します。結局のところ、@ salesはSalesオブジェクトの配列に過ぎないので、これをサポートするのは不合理ではないようです。

しかし、これを行う便利な方法はないようですね。ありがとう。

+0

'@ sales.inspect'とは何ですか? – maprihoda

+0

ハッシュの配列はありません。 –

+0

ああ、私の悪い、デビッドに感謝します。 – Snips

答えて

4

Rails 3を使用している場合、@ salesはAREL基準オブジェクトになります。

@sales = Sales.find(:all, 
        :include => [:salesperson, :customer, :batch, :product], 
        :conditions => {:salesperson_id => someone}, 
        :order => :customer_id)**.all** 

@salesは、Salesモデルオブジェクトの配列のインスタンスです。配列オブジェクトのサブセットを取得するselectメソッドを使用して、今は簡単です:

@my_product_sales = @sales.select { |s| s.product == my_product_criteria } 

select methodを使用したら、あなたは今@sales完全な結果が設定されていると@my_product_salesがコレクトの基準に基づいてサブセットであることがあります。

+0

ありがとう、大変感謝しています! – Snips

+0

これは非常にコストのかかる方法です。そして、これはArelに関連していません。 – Trip