2012-04-08 15 views
8

Yani buRaylarda, Mongoid Kullanarak, tüm Modelleri geçerli (nil olmayan) has_one referansıyla nasıl bulabilirim?

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 

gibi iki model ModelParent raylar konsolda mp denilen I bir kalıcı örneği var varsayarsak var

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

ve sonra döner

mp.model_child 

do ancak geçerli bir nesne

ancak Bu:

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

değil nil, ben model_child oluşturma denedik ve sonra atama da build_model_child() kullanılarak, ve her yöntemi model_child ebeveynde açıkça gösterir ancak sorgu 0

döndürür (.ne) tüm ModelParents'i çocuklarla birlikte bulamamaktadır.

Neyi yanlış yapıyorum?

Güncelleme:

Kendi sorumu cevaplama. model_child.ne => nil çalışmıyor, ancak ...

Böyle bir şey kodlama sorunu çözüldü: Bu kadar yabancı anahtar çalışmıyor

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 

cevap

8

neden hala emin değilim İlişkili tarafa aittir. Yani, sizin durumda ModelChild koleksiyonunda bir alan model_parent_id olacak ve diğer şekilde değil.

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

Çok teşekkürler, bu işe yarar! – KDKotU

0

Ben .NE güvenmek olmaz: Ben zaten anladım, ama bunun yerine Eğer o şekilde çözme, sana has_one ve belongs_to dernek etrafında geçin ve sonra kullanmak öneririm tahmin Böyle durumlarda, .ne yönteminin her zaman iyi çalışmadığını buldum: Örneğin, "false" adlı bir dize koymaya çalışın ve bununla arama yapmayı deneyin.ne ;-)

ben güvenilir uygun modeller bulmak gibi durumlarda en iyi yolunun yerli Mongo bilinen türleri listesinin altında $type

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

göre filtre uygulamak için olduğunu öğrendim, bu kadar buldum

  • Çift bozuk biçimli alanları bulmak için daha verimli 1
  • Dize 2
  • Ob reddet 3
  • Dizisi 4
  • İkili veri 5
  • Tanımsız (kullanımdan kaldırıldı) 6
  • Nesne kimliği 7
  • Boole 8
  • tarihi 9
  • Boş 10
  • Normal İfade 11
  • JavaScript 13
  • (Kapsamında)
  • Sembol 14
  • JavaScript 15
  • 32 bit tamsayı 16
  • zaman damgası 17
  • 64-bit tamsayı 18
  • Minimum temel 255
  • En anahtar 127
0

Başka bir yol buldum, ancak daha verimli veya daha az mı bilmiyorum: reddetme yöntemini kullanabilirsiniz. Örneğin:

ModelParent.all.reject{ |r| r.model_child.nil?} 
İlgili konular