【问题标题】:In Rails, Using Mongoid, How do I find all Models with a valid (not nil) has_one reference?在 Rails 中,使用 Mongoid,如何找到所有具有有效(非 nil)has_one 引用的模型?
【发布时间】:2012-04-08 22:39:24
【问题描述】:

所以我有两个这样的模型

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

【问题讨论】:

    标签: ruby-on-rails mongoid has-one


    【解决方案1】:

    它不起作用,因为外键存储在属于关系的一方。因此,在您的情况下,ModelChild 集合将有一个字段model_parent_id,而不是相反。我猜你已经想通了,但不要像你那样解决它,我建议你切换 has_onebelongs_to 关联,然后使用:

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        在这种情况下我不会依赖 .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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-08-21
          • 2015-03-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多