Tratando de encontrar un número de elementos de una asociación de dos niveles de profundidad, alguna idea?
-
18-09-2019 - |
Pregunta
Estoy trabajando en una aplicación donde necesito encontrar el número de elementos enviados por los usuarios que han sido referidos por un usuario.
Por ejemplo -
Usuario1 se ha referido 3 personas (Usuario2, Usuario3, Usuario4) y cada uno de esos usuarios ha presentado 5 artículos.
Estoy tratando de encontrar una manera de obtener el recuento de los artículos presentados en el árbol de Usuario1 (debería ser 15 en este caso).
Mi modelo de usuario tiene el siguiente aspecto (simplificado)
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
puedo averiguar el recuento para cada usuario con facilidad (User.items.size), pero estoy teniendo problemas para encontrar una solución para obtener los recuentos de referencia como una suma.
¿Alguna idea?
Solución
Prueba esto:
user = User.find(1)
total_items_size = user.referrals.map(&:items).flatten.size
Otros consejos
Puede utilizar select_value ejecutar manualmente la consulta SQL:
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
La ventaja es que es mucho más escalable que usando Ruby a contar.
Obtener todos los elementos de usuario con id de 1
total = 0
Users.find(1).referrals.each do |refer|
total += refer.items.size
end