【发布时间】:2011-10-18 18:06:37
【问题描述】:
我有一个结构,它同时具有 :id 和 :group_id 字段。我希望检索 :id 等于 :group_id 的所有数据。
我目前正在使用 mongoid,但我认为该操作的完成方式与使用 Rails3 的 ActiveRecord 时的操作方式相同。
无论如何。我试图使用Message.where(:group_id => :id),它应该返回,例如:=> #<Message _id: 4e38aa132748440a7e00007d, group_id: BSON::ObjectId('4e38aa132748440a7e00007d')>。但它根本不起作用(似乎它真的不应该起作用,但它应该怎么做呢?)
如何查询 mongoid(或活动记录)以仅获取 :id 等于 :group_id 的消息?
编辑: 只是为了表明这些值确实完全相同:
ruby-1.9.2-p180 :088 > Message.first.id
=> BSON::ObjectId('4e38aa132748440a7e00007d')
ruby-1.9.2-p180 :089 > Message.first.group_id
=> BSON::ObjectId('4e38aa132748440a7e00007d')
编辑2: 这些不起作用(它们至少有一条匹配的消息(上面的示例)):
ruby-1.9.2-p180 :091 > Message.where("group_id = id").count
=> 0
ruby-1.9.2-p180 :092 > Message.where("group_id == id").count
=> 0
编辑3: 以下是应返回的消息示例:http://cl.ly/3q1r20421S3P1921101D
编辑4: 另一个奇怪的地方:
ruby-1.9.2-p180 :034 > Message.where("this._id = this.group_id").each {
|m| puts "#{m.id} = #{m.group_id}" }
4e38aa132748440a7e00007d = 4e38aa132748440a7e00007d
4e38aa132748440a7e00007e = 4e38aa132748440a7e00007d
4e38aa562748440a7e000084 = 4e38aa562748440a7e000084
4e38aa562748440a7e000085 = 4e38aa562748440a7e000084
4e38ac312748440a7e000095 = 4e38ac312748440a7e000095
4e38ac312748440a7e000096 = 4e38ac312748440a7e000095
4e38ac312748440a7e000097 = 4e38ac312748440a7e000095
为什么它返回这些值,即使在某些情况下它们不相等?啊啊啊啊
EDIT5:另一个奇怪的地方和一个不确定的小结论:
ruby-1.9.2-p180 :090 > Message.where("this.read == this.sender_deleted").each {
|m| puts "#{m.read.to_s},#{m.sender_deleted.to_s}" }
true,true
false,false
false,false
false,false
false,false
我的查询使用布尔值!因此,它似乎不仅仅适用于 BSON::ObjectId() 对象比较(我也无法通过执行 Message.where(:id => Message.first.id [编辑:我设法通过使用 :_id 而不是 :id 来检索消息,但这确实不能帮助我解决剩下的问题])。如何在同一个对象上比较这些该死的标识符?我真的需要,而且恐怕没有优雅的选择(将那些完全相同的 ID 存储为字符串太奇怪了,请不要建议这样做:/)。 最后,这似乎是 Mongoid 的一个特定问题。
obs.:我尝试了所有想到的组合,关于 id vs. _id and = vs. ==。是否有任何类似哈希的查询来完成我所需要的?使用类似 .where(:_id => :group_id) 的东西(但不是那个,我的意思是 :group_id 值,而不是 :group_id 符号)。
【问题讨论】:
标签: ruby-on-rails ruby-on-rails-3 activerecord mongodb mongoid