2011-10-11 7 views
8

find_in_batches nie zezwala na czysty SQL (o ile widzę).
find_by_sql nie ma obsługi wsadowej (o ile widzę).Jak mogę zrobić coś takiego jak find_in_batches_by_sql w Railsach

Jak mogę zrobić coś takiego, jak find_in_batches_by_sql?

SQL jest nieprzyjemnie programowo wygenerowany i wskazuje na zewnętrzne bazy danych, a zestawy wyników mogą mieć zwrócone setki tysięcy do milionów rekordów.

Czy są inne sztuczki kursora z ActiveRecord I powinienem zajrzeć?

Dzięki.

Odpowiedz

4

Można zawsze złamać SQL na części i zrobić coś jak

Model.select("*").where("WHERE CLAUSE HERE").joins("JOIN CLAUSES HERE").find_in_batches {...} 

Albo jeśli potrzebne naprawdę zabawa SQL rzeczy można po prostu użyć offset i ograniczenia oraz pętlę dopóki nie wyczerpał wyników. Oto podstawowa idea:

offset = 0 
limit = 1000 

while(results) 
    results = Model.find_by_sql("<your SQL here> OFFSET #{offset} LIMIT #{limit}") 
    offset += limit 
    # Do stuff here 
end 
1

Uwaga przesunięcie powinno po ograniczyć

offset = 0 
limit = 1000 

while(results) 
    results = Model.find_by_sql("<your SQL here> LIMIT #{limit} OFFSET #{offset}") 
    offset += limit 
    # Do stuff here 
end 
Powiązane problemy