2009-08-26 7 views
7

Używam DataMapper, ORM typu open source dla ruby, a ja mam swędzenie, które chciałbym zadrapać. Obecnie DataMapper może wykorzystywać strategiczne ładowanie (SEL) dla relacji jeden-do-wielu, ale nie wiele-do-wielu, gdzie występują zapytania N + 1. Chciałbym się zhakować, wykonując tę ​​pracę poprawnie, ale nie mogę znaleźć gdzie to zrobić. Więc dwuskładnikowa pytanie:Strategic Eager Ładowanie dla relacji wielu do wielu w Datamapper?

  1. Jak uruchomić zestaw testów więc pokaże to być w przypadku braku (nb teraz wszystkie specyfikacje, które powinny być w przypadku braku oznaczone jako Oczekujące.)?
  2. Gdzie i jak SEL jest implementowany dla relacji jeden do wielu?

Odpowiedz

0

Na drugie pytanie, można spróbować nurkowania w kodzie:

/lib/dm-core/associations/relationship.rb

# Eager load the collection using the source as a base 
    # 
    # @param [Collection] source 
    # the source collection to query with 
    # @param [Query, Hash] query 
    # optional query to restrict the collection 
    # 
    # @return [Collection] 
    # the loaded collection for the source 
    # 
    # @api private 
    def eager_load(source, query = nil) 
    targets = source.model.all(query_for(source, query)) 

    # FIXME: cannot associate targets to m:m collection yet 
    if source.loaded? && !source.kind_of?(ManyToMany::Collection) 
     associate_targets(source, targets) 
    end 

    targets 
    end 

./lib/dm-core/associations/ one_to_many.rb:

def lazy_load(source) 
     return if loaded?(source) 

     # SEL: load all related resources in the source collection 
     if source.saved? && (collection = source.collection).size > 1 
     eager_load(collection) 
     end 

     unless loaded?(source) 
     set!(source, collection_for(source)) 
     end 
    end 
+0

Wow, 2½ roku i to wciąż jest FIXME! Czy testy przynajmniej teraz zawodzą poprawnie? –

+0

W rzeczywistości nie rozwijam się z DataMapper, chciałbym móc, ale nie mam czasu. Może to pytanie można zadać w grupach DataMapper lub IRC. – CodeGroover