sql >> Databáze >  >> RDS >> Mysql

Rails – Efektivně vytahujte a počítejte data napříč několika vztahy

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.)



  1. Jak mohu naklonovat databázi SQL Server na stejném serveru v SQL Server 2008 Express?

  2. Instalace MariaDB 10.1 v Debian Jessie a spouštění různých dotazů MariaDB

  3. Jak spouštět php skript automaticky denně?

  4. Základy tabulkových výrazů, Část 10 – Pohledy, SELECT * a změny DDL