RoR3 + Mongoid: Как сравнивать поля коллекции / таблицы при запросах? - PullRequest
3 голосов
/ 03 августа 2011

У меня есть структура, которая имеет поля: 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).

Ответы [ 4 ]

2 голосов
/ 03 августа 2011

В конце концов Mongoid использует MongoDB, поэтому все, что невозможно в mongodb, невозможно сделать с помощью mongoid. Конкретный вариант использования, о котором вы говорите, на данный момент не поддерживается mongodb.

Вы не можете запросить поле к полю, вы должны предоставить литеральные значения для запроса. Я обнаружил проблему на Mongodb Issue Tracker за поддержку этого, но не смог найти ее сейчас.

Запрос логического значения, о котором вы говорите, может быть просто совпадением. Это также не должно работать, как ожидалось.

Обновление

Можно сравнить поля в mongodb, используя предложение $where.

1 голос
/ 17 июля 2013

Вы пропустили '$ где' в методе Mongoid's where

Это сработало для меня:

Message.where('$where' => 'this.group_id == this.id')
1 голос
/ 03 августа 2011

Попробуйте это:

Message.where("this.group_id == this.id")
0 голосов
/ 03 августа 2011
Message.where("group_id = id")
...