2009-08-26 23 views
7

Tôi đang sử dụng DataMapper, một ORM nguồn mở cho ruby ​​và tôi bị ngứa mà tôi muốn làm xước. Hiện tại, DataMapper có thể sử dụng tính năng tải chiến lược (SEL) cho các mối quan hệ một-nhiều, nhưng không phải là nhiều-nhiều, trong đó các truy vấn N + 1 xảy ra. Tôi muốn hack xung quanh với công việc này một cách chính xác, nhưng tôi không thể tìm thấy nơi để làm điều đó. Vì vậy, hai phần câu hỏi:Trình tạo chiến lược Đang tải cho các mối quan hệ nhiều-nhiều trong Datamapper?

  1. Làm thế nào để chạy bộ thử nghiệm để nó hiển thị lỗi này (nb. Ngay bây giờ tất cả các thông số kỹ thuật sẽ không được đánh dấu là đang chờ xử lý)?
  2. SEL được triển khai ở đâu và như thế nào đối với mối quan hệ một-nhiều?

Trả lời

0

Đối với câu hỏi thứ hai, bạn có thể thử lặn vào mã:

/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½ năm và điều này vẫn là FIXME! Làm các bài kiểm tra ít nhất là thất bại ngay bây giờ? –

+0

Thực ra, tôi không phát triển với DataMapper, tôi ước tôi có thể nhưng không có thời gian. Có lẽ câu hỏi này có thể được hỏi trong các nhóm DataMapper hoặc IRC. – CodeGroover

Các vấn đề liên quan