Versuchen Sie, eine Anzahl von Elementen aus einer tiefen Vereinigung von zwei Ebenen zu finden, irgendwelche Ideen?
-
18-09-2019 - |
Frage
Ich arbeite an einer Anwendung, in der ich die Anzahl der eingereichten Elemente von Benutzern finden muss, die von einem Benutzer verwiesen wurden.
Zum Beispiel -
User1 hat 3 Personen (User2, User3, User4) verwiesen und jeder dieser Benutzer hat 5 Artikel übermittelt.
Ich versuche einen Weg zu finden, um die Anzahl der eingereichten Elemente in User1's Tree zu erhalten (sollte in diesem Fall 15 sein).
Mein Benutzermodell sieht aus wie das folgende (vereinfacht)
class User < ActiveRecord::Base
# Code for user referrals
belongs_to :referrer, :class_name => "User"
has_many :referrals, :class_name => "User", :foreign_key => "referrer_id"
has_many :items
end
Ich kann die Anzahl für jeden Benutzer problemlos herausfinden (user.items.size), aber ich habe Probleme, eine Lösung zu finden, um die Empfehlungszählungen als eine Summe zu erhalten.
Irgendwelche Ideen?
Lösung
Versuche dies:
user = User.find(1)
total_items_size = user.referrals.map(&:items).flatten.size
Andere Tipps
Sie können Select_Value verwenden, um die SQL -Abfrage manuell auszuführen:
def referred_items_count
select_value("select count(*) as referred_items
from items inner join users on users.id = items.user_id
where users.referrer_id = #{self.id};", "referred_items")
end
Der Vorteil ist, dass es viel skalierbarer ist, als Ruby zum Zählen zu verwenden.
Holen Sie sich alle Benutzerelemente mit ID von 1
total = 0
Users.find(1).referrals.each do |refer|
total += refer.items.size
end