Chcete-li získat seznam ID uživatelů s více než jedním nákupem, můžete provést následující, čímž získáte přístup pouze k jedné tabulce:
user_ids = PurchasedDeal.count(:group => :user_id, :having => 'count_all > 0').keys
Následně můžete všechny tyto uživatele načíst pomocí:
users = User.find user_ids
Věci lze urychlit pomocí mezipaměti počítadel. Do svého uživatelského modelu přidejte možnost :counter_cache => true
do has_many
sdružení pro nakoupené nabídky. V tabulce uživatelů a inicializaci budete potřebovat další celočíselný sloupec, který může při migraci vypadat následovně:
add_column :users, :purchased_deals_count, :integer, :null => false, :default => 0
User.each { |u| User.reset_counters u, :purchased_deals }
Jakmile to bude z cesty, bude to mnohem jednodušší:
users = User.all :conditions => 'purchased_deals_count > 0'
Rails bude udržovat sloupek aktuální, s většinou standardních operací.
Získání celkové ceny bude vždy zahrnovat připojení. Nebo si můžete vytvořit hash akční ceny a provést únavné zpracování v Ruby. Nejsem žádný odborník na SQL, ale spojení se můžete potenciálně zbavit uložením ceny do PurchasedDeal. Jinak, zde je návod, jak to udělat s připojením:
user_id_to_price = PurchasedDeal.sum 'deal.price', :include => :deal, :group => :user_id
Můžete to filtrovat pouze na uživatele, které chcete, přidáním něčeho jako :conditions => ['user_id IN (?)', users]
. (Kde users
může být seznam ID, ale také Uživatelské objekty.)