2012-05-03 10 views
5

Mam scenariusz tak:mongoid - używając obejmuje wybierz dzieci obiektów w relacji 1..n odwołuje

blog.posts 

gdzie każdy słup należy do innego obiektu, powiedzmy Tag (w relacji has_many, belongs_to), więc mogę zrobić:

tag.posts 

aby uniknąć problemu N + 1, chcę być w stanie zrobić blog.posts, ale również złapać każdego tagu skojarzonego z każdym poście, tak, że dwa zapytania są generowane, jeden dla postów i jeden dla wszystkich tagów (na podstawie każdego tag_id należącego do postu).

zauważyłem w mongoid dokumentacji mogę zrobić:

Post.includes(:tag).where(:blog_id: blog.id) 

który dostanie mi wszystkie posty należące do bloga, a także coraz każdego znacznika związanego ze stanowiskiem i oddanie na mapie tożsamości (pod warunkiem, że jest włączone).

Problem polega na tym, chcę zrobić:

blog.posts 

i jakoś przedefiniować zapytanie robić co chcę powyżej. Czy jest jakiś sposób na zrobienie tego?

W tej chwili mam łagodzenia to poprzez zdefiniowanie rozszerzenia:

has_many :posts do 
    def with_tags 
    includes(:tag) 
    end 
end 

tak, że robię

blog.posts.with_tags 

ale wolałbym że

blog.posts 

robi powyżej domyślnie.

Pozdrawiam.

Odpowiedz

7

Możesz używać zakresów, aby osiągnąć ten konkretny zakres domyślny. Więc w modelu post, można zdefiniować model taki:

class Post 
    belongs_to :tag 
    default_scope includes(:tag) 
end 

tamtędy kiedy robisz zapytanie do zdobycia stanowisk, jak Blog.posts, mongoid będzie również generować zapytania, aby uzyskać wszystkie tagi związane z każdym stanowisko.

+0

Czy jest jakiś inny sposób na zrobienie tego? tj. z obiektu mongoid? – K2xL