За да получите списък с потребителски идентификатори с повече от една покупка, можете да направите следното, което ще има достъп само до една таблица:
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
може да бъде списък с идентификатори, но също и потребителски обекти.)