2009-08-26 11 views
7

Estoy usando DataMapper, un ORM de código abierto para ruby, y tengo un picor que me gustaría rascar. Por el momento, DataMapper puede usar Strategic Eager Loading (SEL) para relaciones de uno a muchos, pero no de muchos a muchos, donde se producen consultas de N + 1. Me gustaría hackear para hacer que esto funcione correctamente, pero no puedo encontrar dónde hacerlo. Así que dos partes pregunta:¿Carga estratégica ansiosa para relaciones de muchos a muchos en Datamapper?

  1. Cómo corro el conjunto de pruebas por lo que se mostrará esta estar fallando (nota: en este momento todas las especificaciones que deben estar fallando están marcados como pendiente.)?
  2. ¿Dónde y cómo se implementa SEL para las relaciones de uno a muchos?

Respuesta

0

Por segunda pregunta, usted podría intentar sumergirse en código:

/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

¡Guau, 2 años y medio y esto todavía es un ARREGLO! ¿Al menos las pruebas ahora fallan correctamente? –

+0

En realidad, no estoy desarrollando con DataMapper, ojalá pudiera, pero no tengo tiempo. Tal vez esta pregunta se puede hacer en grupos de DataMapper o IRC. – CodeGroover

Cuestiones relacionadas