2009-08-26 15 views
7

Sto usando DataMapper, un ORM open source per rubino, e ho in prurito vorrei graffiare. Al momento, DataMapper può utilizzare Strategic Eager Loading (SEL) per le relazioni uno-a-molti, ma non molti-a-molti, dove si verificano le query N + 1. Mi piacerebbe incappare in giro per farlo funzionare correttamente, ma non riesco a trovare dove farlo. Quindi una domanda in due parti:Eager strategico Caricamento per relazioni molti-a-molti in Datamapper?

  1. Come si esegue la suite di test in modo che questo indichi che non sta funzionando correttamente (nb. In questo momento tutte le specifiche che dovrebbero essere considerate non valide sono contrassegnate come in sospeso)?
  2. Dove e come viene implementata la SEL per le relazioni uno-a-molti?

risposta

0

Per seconda domanda, si potrebbe provare a tuffarsi in codice:

/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½ anni e questo è ancora un FIXME! I test almeno falliscono correttamente ora? –

+0

In realtà, non sto sviluppando con DataMapper, vorrei poterne avere il tempo. Forse questa domanda può essere posta nei gruppi DataMapper o IRC. – CodeGroover

Problemi correlati