Чтобы получить список идентификаторов пользователей с более чем одной покупкой, вы можете сделать следующее, чтобы получить доступ только к одной таблице:
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, но вы можете избавиться от объединения, сохранив цену с помощью BuyasedDeal.Иначе, вот как это сделать с объединением:
user_id_to_price = PurchasedDeal.sum 'deal.price', :include => :deal, :group => :user_id
Вы можете отфильтровать это только по нужным пользователям, добавив что-то вроде :conditions => ['user_id IN (?)', users]
.(Где users
может быть списком идентификаторов, но также объектов пользователя.)