2010-12-15 10 views
6

Tengo dos modelos Usuario y Evento. La cardinalidad es un usuario tiene muchos eventos. Cuando consulto la base de datos para darme todos los usuarios y sus correspondientes eventos, devuelve los resultados correctos. Declaración de ejemplo: Users.find (: all,: include => [: events])Ruby on Rails - Agregar condición en ': incluir =>' para cargar un número limitado de objetos

Sin embargo, lo que necesito ayuda es obtener eventos para un usuario en función de una condición. Necesito que cada Usuario devuelto obtenga solo Eventos que están programados para hoy (ej: CREATED_DATE = TODAY). Es decir, no quiero todos los eventos asociados a los usuarios. Dijo que todavía necesito todos los usuarios encontrados en la base de datos, pero para algunos de esos usuarios que no tienen un evento programado para hoy, no deberían tener un evento cargado en el mapa hash.

¿Alguien puede ayudarme con la modificación de "Users.find (: all,: include => [: events])" Declaración de Rails para que solo pueda obtener ciertos eventos para los usuarios, no para todos los eventos?

Gracias, S

Respuesta

1

Que yo sepa, no se puede utilizar el: incluyen la opción de la manera que usted describe.

¿Cuál es su problema para obtener todos los eventos de todos modos? Tendrás que cargar/unir/consultar la tabla de eventos de todos modos. Sin embargo, necesitará más memoria si crea todos los eventos.

Por supuesto, podría hacer dos consultas, una para los usuarios con los eventos "hoy" y otra para los que no.

También se puede ir al revés:

Event.find(:all, :conditions => "...only today...", :include => :user) 

que le daría todos los eventos de hoy en día con los usuarios incluidos. Puede utilizar otra consulta para obtener todos los usuarios sin incluir los eventos y hacer el resto en la memoria.

+2

Estoy trabajando con objetos de usuario, ¿cómo puedo invertir los objetos para que los eventos estén dentro de los usuarios y no los eventos que contengan los usuarios como se sugiere en la declaración anterior ? Si puedo hacerlo fácilmente (se requiere menos procesamiento), esta solución puede funcionar. :) – partizan

+0

Pero eso aún no devolverá ningún usuario que no tenga eventos. – lala

6

algo en este sentido debería funcionar:

# Rails 3 
User.includes(:events).where(:events => {:created_at => Time.now.midnight..Time.now.tomorrow.midnight}) 

# Rails 2 
User.find(:all, :includes => :events, :conditions => ["events.created_at between ? and ?", Time.now.midnight, Time.now.tomorrow.midnight]) 

Time.now.tomorrow.midnight es bastante desagradable. 1.day.from_now.midnight puede ser un poco menos desagradable, dependiendo de su preferencia;)

+3

Gracias idlefingers por su sugerencia, pero no creo que funcione en función de lo que estoy tratando de hacer. La consulta no devolverá los Usuarios que no tienen Eventos, sino solo los Usuarios que sí lo tienen. Para mi problema, quiero todos los usuarios, pero algunos también tendrán eventos (si su evento está programado para hoy). – partizan

+0

Pensé que habría incluido usuarios sin eventos porque usar includes normalmente hace dos consultas para cargar las asociaciones con entusiasmo. Parece que arel lo convierte en una combinación externa izquierda cuando introduces la cláusula where en la mezcla, lo que explicaría por qué solo se trata de usuarios recurrentes que tienen eventos. 'User.joins (: events) .where (como en el caso anterior)' crea la consulta correcta (utilizando una combinación interna), pero no parece cargar con entusiasmo los artículos. Hmm. – idlefingers

Cuestiones relacionadas