Tratando de encontrar un número de elementos de una asociación de dos niveles de profundidad, alguna idea?

StackOverflow https://stackoverflow.com/questions/1696119

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?

¿Fue útil?

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top