2009-08-26 10 views
7

Ich benutze DataMapper, ein Open-Source-ORM für Ruby, und ich habe in Juckreiz möchte ich kratzen. Momentan kann DataMapper das Strategic Eager Loading (SEL) für Eins-zu-Viele-Beziehungen verwenden, jedoch nicht für Viele-zu-Viele, bei denen N + 1-Abfragen auftreten. Ich würde gerne herumhacken, um diese Arbeit richtig zu machen, aber ich kann nicht herausfinden, wo ich es machen soll. Also zweiteilige Frage:Strategische Eager Loading für viele-zu-viele Beziehungen in Datamapper?

  1. Wie ich die Testsuite ausführen, so wird es zeigen, dass dies fehlschlägt (nb. Gerade alle Spezifikationen, die fehlschlagen sollten als ausstehend markiert sind)?
  2. Wo und wie wird SEL für Eins-zu-viele-Beziehungen implementiert?

Antwort

0

für die zweite Frage, könnten Sie tauchen Sie ein in Code versuchen:

/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½ Jahre und das ist immer noch ein Fixme! Scheitern die Tests jetzt zumindest richtig? –

+0

Eigentlich entwickle ich nicht mit DataMapper, ich wünschte, ich könnte aber keine Zeit haben. Vielleicht kann diese Frage in DataMapper-Gruppen oder IRC gestellt werden. – CodeGroover

Verwandte Themen