2012-04-08 4 views
8

así que tengo un dos modelos de este tipoEn Rails, usando Mongoid, ¿cómo puedo encontrar todos los modelos con una referencia válida (no nula) has_one?

class ModelParent 
    include Mongoid::Document 
    field :name, :type => String 
    has_one :model_child 
end 

class ModelChild 
    include Mongoid::Document 
    field :name, :type => String 
    belongs_to :model_parent 
end 

Suponiendo que tengo una instancia PERSISTED de ModelParent llama mdp en la consola rieles

mc = mp.create_model_child(:name=>"child") 

y luego hacer

mp.model_child 

vuelve un objeto válido

sin embargo si lo busco como esto:

ModelParent.where(:model_child.ne => nil).length 

devuelve 0

He intentado crear model_child y después asignarlo, utilizando también build_model_child(), y cada método muestra model_child es claramente en la matriz, sin embargo la consulta para no nula (.ne) no puede encontrar todos los ModelParents con hijos.

¿Qué estoy haciendo mal?

Actualización:

responder a mi propia pregunta. Todavía estoy seguro de por qué el: model_child.ne => nil no está funcionando, sin embargo ...

He resuelto el problema mediante la codificación de algo como esto:

def self.with_child 
    user_ids = ModelChild.all.only(:model_parent_id).map(&:model_parent_id) 
    return ModelParent.where(:_id.in => user_ids).all 
    end 

Respuesta

8

No está funcionando como clave externa se almacena en pertenece al lado de la relación. Entonces, en su caso, la colección ModelChild tendrá un campo model_parent_id y no al revés. Supongo que ya había dado cuenta de eso, pero en vez de resolverlo de la manera que lo hizo, yo sugeriría que cambia alrededor de las asociaciones has_one y belongs_to y luego usar:

ModelParent.where(:model_child_id.ne => nil) 
+0

Muchas gracias, eso funciona una delicia! – KDKotU

0

yo no confiar en la .NE en tales casos, encontré que el método .ne no siempre funciona bien: Por ejemplo, intente poner una cadena llamada "falsa" e intente buscarla con.ne ;-)

descubrí que para tales casos la mejor manera de encontrar los modelos apropiados de forma fiable es filtrar por los nativos Mongo $type

ModelParent.where(:model_child_id => { :$type => 7 }) 

A continuación la lista de tipos conocidos, ha encontrado mucho más eficiente para encontrar campos con formato incorrecto

  • dobles 1
  • cadena 2
  • Ob Ject 3
  • matriz 4
  • datos binarios 5
  • Indefinido (en desuso) 6
  • ID del objeto 7
  • Boolean 8
  • Fecha 9
  • Null 10
  • Expresión Regular 11
  • JavaScript 13
  • Símbolo 14
  • JavaScript (con alcance) 15
  • 32-bit entero de 16
  • Timestamp 17
  • 64 bits número entero clave 18
  • Min clave 255
  • Max 127
0

Encontré otra manera, pero no sé si es más eficiente o menos: puede usar el método de rechazo. Por ejemplo:

ModelParent.all.reject{ |r| r.model_child.nil?} 
Cuestiones relacionadas