2010-10-25 20 views
1

我正在構建一個從Rails應用程序中提取大量數據的Rails插件。它動態構建跨越多個表的查詢,並且會返回大量結果。下面是拉動購買數據進行了狂歡(Rails的購物車)的內置查詢的一個示例:是否可以在Rails/ActiveRecord中運行find_by_sql查詢而不將所有結果加載到內存中?

select orders.user_id as from_id, variants.product_id as to_id from orders, line_items, variants where orders.user_id is not null and variants.product_id is not null and orders.id = line_items.order_id and line_items.variant_id = variants.id order by from_id;

的問題是,ActiveRecord的負載可達所有結果到內存中。有沒有辦法避免這種情況,而不必放棄編寫特定於DB的代碼? (我知道find_each的,但不允許進行排序。)

回答

0

海梅的回答使我沿着查詢降落在will_paginate的更高效的路徑,它提供了一個paginate_by_sql方法。

def paginated_sql_each(query, &block) 
    page = 1 
    begin 
    results = paginate_by_sql(query, :page => page) 
    results.each { |r| block.call(r) } 
    page += 1 
    end while !results.empty? 
end 
相關問題