У меня есть структура, которая имеет поля: id и a: group_id. Я хочу получить все данные, которые: id равно: group_id.
В настоящее время я работаю с mongoid, но думаю, что операция выполняется так же, как и при использовании ActiveRecord в Rails3.
В любом случае. Я пытался использовать Message.where(:group_id => :id)
, который должен вернуть, например, это: => #<Message _id: 4e38aa132748440a7e00007d, group_id: BSON::ObjectId('4e38aa132748440a7e00007d')>
. Но он не работает вообще (кажется, что он действительно не должен работать, но как тогда?)
Как я могу запросить mongoid (или активную запись), чтобы получить только сообщения, где: id равно: group_id?
EDIT:
просто чтобы показать, что эти значения действительно одинаковы:
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')
EDIT2:
Они не работают (у них есть хотя бы одно совпадающее сообщение (пример выше)):
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
EDIT3:
Вот пример сообщения, которое должно быть возвращено: http://cl.ly/3q1r20421S3P1921101D
EDIT4:
Еще одна странность:
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
Почему он возвращает эти значения, хотя в некоторых случаях они не равны? Aaaarghhhhh
РЕДАКТИРОВАТЬ5: Еще одна странность и небольшой неубедительный вывод:
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, но это сделал не поможет мне в оставшихся моих проблемах]). Как я могу сравнить эти чертовы идентификаторы на одном и том же объекте? Мне действительно нужно, и я боюсь, что нет элегантной альтернативы (хранить те же идентификаторы, как строки, было бы слишком странно, пожалуйста, не предлагайте это: /) . В конце концов, это похоже на специфическую проблему для Mongoid .
obs .: Я перепробовал все комбинации, которые приходили на ум, относительно id против _id и = против == . Есть ли Hash-подобный запрос для выполнения того, что мне нужно? используя что-то вроде .where (: _ id =>: group_id) (но не это, я имею в виду значение: group_id, а не символ: group_id).