8

だから私はこのような2つのモデルを持っています

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

RailsコンソールにmpというModelParentの永続化されたインスタンスがあると仮定します

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

そしてします

mp.model_child

有効なオブジェクトを返します

ただし、次のように検索すると、次のようになります。

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

0を返します

model_childを作成してから、build_model_child()を使用して割り当てようとしました。各メソッドは、model_childが明らかに親にあることを示していますが、not nil(.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
4

3 に答える 3

8

関係の側に属する外部キーが格納されているため、機能していません。したがって、あなたの場合、ModelChildコレクションにはフィールドがmodel_parent_idあり、その逆はありません。あなたはすでにそれを理解していると思いますが、あなたがしたようにそれを解決する代わりに、私はあなたがhas_oneとのbelongs_to関連付けを切り替えてから使用することをお勧めします:

 ModelParent.where(:model_child_id.ne => nil)
于 2012-04-09T10:15:43.703 に答える
1

別の方法を見つけましたが、効率が良いか低いかはわかりません。rejectメソッドを使用できます。例えば:

ModelParent.all.reject{ |r| r.model_child.nil?}
于 2014-05-12T12:37:59.433 に答える
0

このような場合、.neに依存しないので、.neメソッドが常に適切に機能するとは限らないことがわかりました。たとえば、「false」という名前の文字列を入力して、.neで検索してみてください;-)

そのような場合、適切なモデルを確実に見つけるための最良の方法は、ネイティブのMongoでフィルタリングすることであることがわかりました。$type

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

既知のタイプのリストの下で、これが不正な形式のフィールドを見つけるのにはるかに効率的であることがわかりました

  • ダブル1
  • 文字列2
  • オブジェクト3
  • アレイ4
  • バイナリデータ5
  • 未定義(非推奨)6
  • オブジェクトID7
  • ブール8
  • 日付9
  • ヌル10
  • 正規表現11
  • JavaScript 13
  • シンボル14
  • JavaScript(スコープ付き)15
  • 32ビット整数16
  • タイムスタンプ17
  • 64ビット整数18
  • 最小キー255
  • 最大キー127
于 2014-03-12T22:46:39.943 に答える