2012-04-08 11 views
8

그래서 나는이Races에서 Mongoid를 사용하여 유효하지 않은 (0이 아닌) 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 

같은 두 가지 모델이 ModelParent가 레일 콘솔에서 MP라고의 I가 지속 된 인스턴스가있는 가정이

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

다음은 반환

mp.model_child 

할 유효한 개체

그러나 내가 그것을 검색하면 이 :

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

그렇지 전무를 들어, 내가 model_child을 만드는 시도하고 다음을 할당, 또한 build_model_child()를 사용하여, 각각의 방법은 model_child 부모 명확하게 보여줍니다 그러나 쿼리를 0

을 반환 (.ne)은 자식이있는 모든 ModelParent를 찾지 못합니다.

내가 뭘 잘못하고 있니?

업데이트 :

내 질문에 답하는 중. model_child.ne => nil이 작동하지 않습니다, 그러나 ...

나는 이런 식으로 뭔가를 코딩하여 문제를 해결 : 그것은 외국 키를 작동하지

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 

답변

8

왜 '난 아직 확실 해요 관계에 속한에 속한다. 그래서, 귀하의 경우에 ModelChild 컬렉션에는 필드가 model_parent_id이고 그 반대의 경우는 없습니다.

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

대단히 감사합니다. – KDKotU

0

나는 .ne에 의존하지 것이다 : 나는 당신이 이미 알아 냈했지만, 대신 당신이 그런 식으로 해결, 나는 당신이 has_onebelongs_to 협회 중심으로 전환 한 후 사용하는 것이 좋습니다 것 같아요 그런 경우에 .ne 메서드가 항상 잘 작동하는 것은 아닙니다. 예를 들어 "false"라는 문자열을 넣고 검색해보십시오.네브라스카 ;-)

내가 안정적으로 적절한 모델을 찾을 수 이러한 경우에 가장 좋은 방법은 기본 몽고 알려진 형식의 목록을 아래 $type

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

을 기준으로 필터링하는 것을 발견,이 정도 발견

  • 더블 잘못된 필드를 찾을하는 것이 더 효율적 1
  • 문자열이
  • 오브 ject 3
  • 어레이 4
  • 이진 데이터 5
  • 불확정 (중단) 6
  • 오브젝트 ID 7
  • 부울 8
  • 날짜 9
  • 널 10
  • 정규식 11
  • 자바 스크립트 13
  • (스코프)
  • 기호 14
  • 스크립트 15
  • 32 비트 정수 16
  • 소인 17
  • 64 비트 정수 18
  • 최소 키 255
  • 맥스 키 127
0

다른 방법을 찾았지만 더 효율적인지 또는 덜 효율적인지 알 수 없습니다. reject 메서드를 사용할 수 있습니다. 예 :

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