2012-04-03 8 views
11

Estoy tratando de encontrar un registro por nombre de usuario asociado que se incluye en una relación belongs_to, pero no está funcionando.carriles mongoid criterios encontrar por asociación

los artículos pertenecen a los usuarios Los usuarios tienen muchos artículos

Article.where(user_id: someid) funciona bien, pero me gustaría usar el nombre de usuario como referencia que se almacena en la tabla de usuarios.

Article.includes(:user).where(:username => "erebus") 
Article.includes(:user).where("user.username" => "erebus") 

También tengo identity_map_enabled: true

Article.includes(:user).inclusions devuelve los detalles de relación

no funciona, ¿qué estoy no entender?

Respuesta

27

Debe tener en cuenta que no hay uniones en mongodb. En dbs relacionales, includes forma una consulta de combinación y puede usar columnas de ambas tablas en la consulta. Sin embargo, debido a la ausencia de combinaciones en mongodb, no es posible.

En mongoid, includes solo guarda un montón de llamadas de DB. Busca y almacena los registros asociados en el mapa de identidad para una recuperación rápida, pero aún mientras consulta, una consulta solo puede tratar con una colección.

Si necesita artículos basados ​​en los nombres de usuario, sugeriría siguientes trabajos en torno a:

user_ids = User.where(username: 'erebus').only(:_id).map(&:_id) 
articles = Article.where(:user_id.in => user_ids) 
+0

¿qué pasa si obtenemos los datos de otra manera y no hay ninguna matriz en la colección actual, pero la otra uno ? – Laurent

+0

oh sí, sé la respuesta: no puedes. – Laurent

13

Se puede hacer poco más corto de lo que rubish sugirió:

user_ids = User.where(username: 'erebus').pluck(:id) 
articles = Article.where(:user_id.in => user_ids) 

O un trazador de líneas:

articles = Article.where(:user_id.in => User.where(username: 'erebus').pluck(:id)) 
+0

Me encanta el trazador de líneas sin la función de mapa también – HoosierCoder

Cuestiones relacionadas