複数購入したユーザーIDのリストを取得するには、次のようにします。これにより、1つのテーブルにのみアクセスできます。
user_ids = PurchasedDeal.count(:group => :user_id, :having => 'count_all > 0').keys
その後、次のコマンドでこれらすべてのユーザーを取得できます:
users = User.find user_ids
カウンターキャッシュで物事をスピードアップできます。ユーザーモデルに、オプション:counter_cache => true
を追加します has_many
に 購入した取引のための協会。ユーザーテーブルと初期化に追加の整数列が必要になります。これは、移行では次のようになります。
add_column :users, :purchased_deals_count, :integer, :null => false, :default => 0
User.each { |u| User.reset_counters u, :purchased_deals }
それが邪魔にならないようになると、それははるかに簡単になります:
users = User.all :conditions => 'purchased_deals_count > 0'
Railsは、ほとんどの標準的な操作で、列を最新の状態に保ちます。
合計金額を取得するには、常に参加が必要です。または、取引価格のハッシュを作成して、Rubyで面倒な処理を行うこともできます。私はSQLの専門家ではありませんが、PurchasedDealで価格を保存することで、結合を取り除くことができる可能性があります。それ以外の場合は、結合を使用してそれを行う方法は次のとおりです。
user_id_to_price = PurchasedDeal.sum 'deal.price', :include => :deal, :group => :user_id
:conditions => ['user_id IN (?)', users]
のようなものを追加することで、必要なユーザーだけでそれをフィルタリングできます。 。 (users
IDのリストにすることも、ユーザーオブジェクトにすることもできます。)