2012-05-10 11 views
6

Jak sprawdzić, czy dokument wbudowany istnieje dla dokumentu używającego mongoid w Ruby on Rails? Załóżmy, że mam dokument user, który ma name, email i może mieć osadzony dokument nicknames. Teraz, jeśli uruchomię user.first.nicknames i jeśli ten user nie zawiera osadzonego dokumentu nicknames, wystąpi błąd. Próbowałem już matches? i exists?, ale one nie działają.Jak sprawdzić, czy dokument osadzony istnieje w dokumencie w mongoid?

Dzięki!

Odpowiedz

3

To powinno powrócić true, jeśli nie istnieje User.first.nicknames.nil? a ten zwróci true, jeśli istnieje: User.first.nicknames.present?

+0

Oba te elementy nie działają na dokumencie mongoDB, który nie ma "pseudonimów". Tworzy błąd "NoMethodError: undefined method nickname". To działa dla dokumentów, które mają 'pseudonimy' .. – Goalie

+0

To nie jest to, co robię, używam MongoId 2.3.3. Wydaje mi się, że 'User.first' jest w rzeczywistości zerowe. Więc próbujesz wywołać 'pseudonimy' na obiekcie zerowym. Czy możesz to sprawdzić? – ctcherry

0

powinno być tak proste, jak {"user":{"$exists":"nicknames"}}

+0

Czy to polecenie powłoki Mongo? Szukam rozwiązania w Ruby on Rails. – Goalie

2

Można zrobić User.where(:nicknames.exists => true).include?(user).

User.where(:nicknames.exists => true) zwróci tylko te dokumenty, które zawierają nicknames.

8

Przy odrobinie pomocy z innych odpowiedzi tutaj, znalazłem coś, co zadziałało dla mnie i myślę, że to jest to, co pierwotny plakat miał na myśli;

Model.where(:"subdoc.some_attribute".exists => true) 

Spowoduje to zwrócenie wszystkich dokumentów, w których istnieje "jakiś_atrybut" w pod-dokumencie. Zwróć uwagę na składnię symbolu, tego właśnie mi brakowało.

+0

Możesz także przejść przez powiązanie: 'Model.subdocs.where (: field.exists => true)'. –

+0

Tego właśnie szukałem przez cały dzień. To nie jest udokumentowane nigdzie !? – fre2ak

Powiązane problemy