Para obtener una lista de ID de usuario con más de una compra, puede hacer lo siguiente, que accederá a una sola tabla:
user_ids = PurchasedDeal.count(:group => :user_id, :having => 'count_all > 0').keys
Posteriormente, puede obtener todos estos usuarios con:
users = User.find user_ids
Las cosas se pueden acelerar con un contador de caché. En su modelo de usuario, agregue la opción :counter_cache => true
al has_many
asociación para ofertas compradas. Necesitará una columna entera adicional en su tabla de usuarios e inicializar, que podría tener el siguiente aspecto en una migración:
add_column :users, :purchased_deals_count, :integer, :null => false, :default => 0
User.each { |u| User.reset_counters u, :purchased_deals }
Una vez que eso está fuera del camino, se vuelve mucho más simple:
users = User.all :conditions => 'purchased_deals_count > 0'
Rails mantendrá la columna actualizada por usted, con la mayoría de las operaciones estándar.
Obtener el precio total siempre implicará una unión. O puede crear un hash de precios de ofertas y realizar el tedioso procesamiento en Ruby. No soy un experto en SQL, pero potencialmente puede deshacerse de la unión almacenando el precio con el Acuerdo comprado. De lo contrario, aquí se explica cómo hacerlo con una unión:
user_id_to_price = PurchasedDeal.sum 'deal.price', :include => :deal, :group => :user_id
Puede filtrar eso solo por los usuarios que desee agregando algo como :conditions => ['user_id IN (?)', users]
. (Donde users
puede ser una lista de ID, pero también objetos de Usuario).