8

所以我有两个这样的模型

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)无法找到所有有孩子的ModelParents。

我究竟做错了什么?

更新:

回答我自己的问题。我仍然不确定为什么 :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_oneandbelongs_to关联,然后使用:

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

我找到了另一种方法,但我不知道效率更高还是更低:您可以使用拒绝方法。例如:

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
  • 对象 ID 7
  • 布尔值 8
  • 日期 9
  • 空 10
  • 正则表达式 11
  • JavaScript 13
  • 符号 14
  • JavaScript(带作用域) 15
  • 32 位整数 16
  • 时间戳 17
  • 64 位整数 18
  • 最小键 255
  • 最大键 127
于 2014-03-12T22:46:39.943 回答