2012-04-08 7 views
8

quindi ho una due modelli come questoIn Rails, usando Mongoid, come faccio a trovare tutti i modelli con un riferimento has_one valido (non nullo)?

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 

Supponendo che ho un'istanza persistente di ModelParent chiamato mp nella console rotaie

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

e quindi fare

mp.model_child 

restituisce un oggetto valido

tuttavia se lo cerco come questo:

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

restituisce 0

Ho cercato di creare model_child e poi assegnarla, utilizzando anche build_model_child(), e ogni metodo mostra model_child è chiaramente nel genitore, tuttavia la query per non nullo (.ne) non riesce a trovare tutti i ModelParents con figli.

Cosa sto sbagliando?

Aggiornamento:

Rispondere alla mia domanda. Sono ancora incerto perché il: model_child.ne => nil non funziona, però ...

ho risolto il problema codificando qualcosa di simile:

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 

risposta

8

Non funziona chiave come estraneo è memorizzato su appartiene al lato della relazione. Quindi, nel tuo caso la collezione ModelChild avrà un campo model_parent_id e non viceversa. Credo che si era già capito che fuori, ma invece di risolvere nel modo che hai fatto, vorrei suggerire di passare attorno alle associazioni has_one e belongs_to e quindi utilizzare:

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

Grazie mille, che funziona un piacere! – KDKotU

0

non vorrei contare sulla .ne in questi casi, ho scoperto che il metodo .ne non funziona sempre bene: Ad esempio, prova a mettere una stringa chiamata "false" e prova a cercarla con.ne ;-)

ho scoperto che per tali casi il modo migliore per trovare i modelli appropriati in modo affidabile è quello di filtrare per nativo Mongo $type

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

Di seguito l'elenco dei tipi conosciuti, ha trovato questo molto più efficiente per trovare campi malformati

  • doppie 1
  • String 2
  • Ob ject 3
  • Array 4
  • dati binari 5
  • indefinito (obsoleto) 6
  • ID ogetto 7
  • booleana 8
  • Data 9
  • Null 10
  • espressioni regolari 11
  • JavaScript 13
  • Simbolo 14
  • JavaScript (con portata) 15
  • 32-bit integer 16
  • Timestamp 17
  • 64 bit integer chiave 18
  • Min chiave 255
  • Max 127
0

Ho trovato un altro modo, ma non so se è più efficiente o meno: è possibile utilizzare il metodo di rifiuto. Ad esempio:

ModelParent.all.reject{ |r| r.model_child.nil?} 
Problemi correlati