Tengo 2 relaciones de registro activo

class Proxy  
   # capacity integer  
   # country string  
   has_many :configs  
end

class Config  
   belongs_to :proxy  
   # proxy_id  
   # port integer 
end

Quiero encontrar en una consulta activerecord todos los proxies para un país específico, donde la capacidad es menor que sus configuraciones y ordenarlos por contador de configuraciones.

Quiero decir, estaba tratando de hacer algo como (ejemplo de pseudo registro de actividad)

Proxy.joins(:configs).where(country: country)
                    .where("capacity > ?", :configs.count)
                    .order_by(:configs.count)

Supongo que tal vez estoy enredado con mi problema y tiene una solución fácil.

¡Gracias de antemano!

0
Horacio 16 oct. 2018 a las 17:10

2 respuestas

La mejor respuesta

Intente usar un : counter_cache en las asociaciones

class Proxy  
 # configs_count integer
 has_many :configs  
end

class Config  
 belongs_to :proxy, counter_cache: true
end

Entonces podrías hacer algo como:

Proxy.where(country: country)
     .where("capacity > ?", :configs_count)
     .order_by(:configs_count)
1
R. Sierra 16 oct. 2018 a las 14:46

Es estándar SELECT ... JOIN ... GROUP BY ... HAVING ... ORDER tarea SQL:

Proxy.
  joins(:configs).
  group(:id).
  having('proxies.capacity > count(configs.id)').
  order('count(configs.id)')
1
Pavel Mikhailyuk 16 oct. 2018 a las 14:40