Binarylogic's searchlogic vs. mislav-will_paginate

Bo to jest tak: searchlogic jest rewelacyjny do składania zapytań SQL w zastępstwie (a raczej jako nakładka na) wysłużonego Model.find. Zwłaszcza w temacie zakresów (większy-mniejszy od) określanych przez hasha i jednoczesne zupełne ignorowanie fragmentów, które jako wartość dostały nil (czyli świetne do montowania filtrów po np. dacie i np. jednoczesnego sortowania po danej kolumnie).

Natomiast mislav-will_paginate, choć słabszy od tego wyżej w temacie składania zapytań, to ma bardzo przyjemne helpery generujące odnośniki do kolejnych stron, do których można łatwo pisać własne renderery czy nadpisywać fragmenty już istniejących. Naprawdę rewelacja, spróbujcie kiedyś - można naprawdę fajne zestawy linków do stronicowania wyświetlić (pierwsze strony jako linki, wszystkie środkowe jako select z javascriptowym onchange=href, ostatnie znowu jako linki - na przykład).

Fajnie by było mieć możliwość wyszukiwania i ogólnie obsługi backendu poprzez searchlogic, a mieć linki do stron generowane przez mislav-will_paginate. Jednak helpery tego ostatniego potrzebują nie prymitywnego Array’a, tylko własnej klasy (rozszerzającej Array zresztą) WillPaginate::Collection, trzymającej m.in. łączną ilość rekordów do wystronicowania czy ilość stron (to już sobie liczy samodzielnie). Oto jak temu zaradzić.
w kontrolerze albo modelu:

search = Model.new_search(...) # searchlogic search models_arr = search.find(:all) # :joins => ..., itp. itd. @models = WillPaginate::Collection.new(search.page, search.per_page) @models.replace(models_arr) @models.total_entries = search.count
A w widoku… dokładnie tak samo jak do tej pory używało się mislav-will_paginate :slight_smile:

prosto i na temat :slight_smile: świtało mi, że pisałeś o tym, ale (to chyba w związku z grypą) trafiłem z googla :smiley:

dzięki akurat potrzebowałem szybkiej odpowiedzi

ave

No tak, fajnie, tylko czy przypadkiem nie załaduje to wszystkiego co znajdzie find() do tablicy? WillPaginate świetnie użyty na NamedScope zrobi odpowiednio limit i offset, dzięki czemu nie będzie wszystkich rekordów zwróconych przez zapytanie w pamięci na raz. Mogę się mylić, ale wydaje mi się że w tym przypadku z NamedScope zrobi się Array i cała lista rekordów będzie w pamięci, dopiero później zostanie podzielona na strony. Nie jest tak?

Nie, searchlogic domyślne (w sensie stary searchlogic, 1.x) dorzuca limity pod paginację, przez co scope.all zwróci kilka (domyślnie 25) rekordów.

Aha, to tego nie wiedziałem (nie używam Searchlogic). Zwracam honor i kłaniam. :wink:

[quote=“Dokumentacja”]Pagination (leverage will_paginate)

Instead of recreating the wheel with pagination, Searchlogic works great with will_paginate. All that Searchlogic is doing is creating named scopes, and will_paginate works great with named scopes:

User.username_like("bjohnson").age_less_than(20).paginate(:page => params[:page]) User.search(:username_like => "bjohnson", :age_less_than => 20).paginate(:page => params[:page])
If you don’t like will_paginate, use another solution, or roll your own. Pagination really has nothing to do with searching, and the main goal for Searchlogic v2 was to keep it lean and simple. No reason to recreate the wheel and bloat the library.[/quote]
A tak po prostu?

w kontrolerze (explicite :wink: ):

@my_condition = Item.whatever #named_scope @search = @my_condition.search(params[:search]) @items = @search.all.paginate :page => params[:page], :per_page => 10
i w widoku bez zmian.