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?
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 ?