Mongoid i zagnieżdżanie jednego obiektu z większej kolekcji

Howgh.

Klasyka. Użytkownik ma wiele komentarzy. Komentarze są w osobnej kolekcji, wszystko połączone mongoidowym references_many / referenced_in.

Chciałbym ostatni komentarz dodany przez danego użytkownika trzymać w jego kolekcji (zawsze kiedy się pojawia lista użytkowników, wyświetlany jest ostatni komentarz każdego – znaczy chcę uniknąć n+1 zapytań).

Jeśli zrobię

class User embeds_one :last_comment, :class_name => "Comment"
to bangla, oprócz tego że nie zapisuje owego last_comment i nawet po przypisaniu oraz save mam tam wciąż nil.

Jeśli dopiszę drugą stronę relacji

class Comment embedded_in :user, :inverse_of => :last_comment
To wtedy w ogóle mam kosmos, bo mi wywala puste kolekcje przy dowolnym wyszukiwaniu Commentów.

Da się to jakoś tak zrobić? Czy muszę zrobić osobną klasę tyou LastComment, wyłącznie zagnieżdżaną, do której będę klonował ostatni komentarz?

Rozważam jeszcze zrobienie tego w brutalnym, activerecordowym stylu, czyli po prostu pole tekstowe z zserializowanym ostatnim komentarzem (pole typu last_comment_json). Ale to dość brutal oraz nie jestem pewien czy that’s how we roll with Mongo?

Z tym JSONem to chyba przesada. Przecież Mongo obsługuje storage np. tablic czy hashów.

Tak, ale do JSONa od razu mamy odwijane kilka customowych pól/metod. Oraz Mongoid nie udostępnia dla modelu metody to_hash :confused:

To chyba jest podstawowy problem NoSQL. Denormalizacja danych na każdym kroku.

Trochę offtopic ale polecam propagandowy (ale tylko troszkę) talk http://www.infoq.com/presentations/Enterprise-NoSQL, nie jest to jeden z tych wielu talków gdzie mówca jest albo za jednym albo za drugim rozwiązaniem. Pomimo że gość jest z IBM uważam że doskonale wyłożył problemy NoSQL i SQL

PS. MongoMapper ze swoim one-to-many i one-to-one działa tak samo kiepsko ?

http://mongoid.org/docs/documents/fields.html … types:

  • Hash

O to chodziło, że tego brakuje? Myślę, że pakowanie tego w JSON to tylko dodatkowy problem : ) A z tego co wiem, hash może zagnieżdzać hash.

Ja zawsze ten problem rozwiązuje jednak oddzielnym zaembedowanym modelem - czyli tak jak zaproponowałeś rozwiązanie z LastComment.

Nothing’s perfect.

Przecież napisałem wyraźnie że mam już relację, ale chcę zrobić caching pomimo tego. Pierwszy akapit, ziom :slight_smile:

Oraz owszem, MongoMapper ssie jeszcze mocniej, bo nawet nie używa ActiveModel.

Ależ ja jestem głupi, oczywiście że tak, skoro JSON i tak mi to pakuje/odpakowuje w Hasha. Dzięki!