Ruby on Rails PL Forum

Forum poświęcone Ruby on Rails i językowi programowania Ruby

Nie jesteś zalogowany.

#1 2009-02-02 19:41:17

Tomash
RoR Guru
Zarejestrowany: 2007-04-01
Posty: 1437

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:

Kod:

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 smile


http://tomash.wrug.eu/ - homepage & techblog
http://wrug.eu/ - Warsaw Ruby Users Group: spotkania i materiały z nich

Offline

 

#2 2009-10-03 11:46:39

Wojciech Zieliński
Adept
Od: Pszczyna
Zarejestrowany: 2008-08-25
Posty: 181
Serwis

Re: binarylogic's searchlogic vs. mislav-will_paginate

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

dzięki akurat potrzebowałem szybkiej odpowiedzi

ave

Offline

 

#3 2009-10-03 14:48:06

hubertlepicki
Bywalec
Zarejestrowany: 2008-07-15
Posty: 228

Re: binarylogic's searchlogic vs. mislav-will_paginate

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?


Hubert Łępicki
AmberBit ruby development company
http://amberbit.com
http://amberbit.pl

Offline

 

#4 2009-10-03 14:49:59

Tomash
RoR Guru
Zarejestrowany: 2007-04-01
Posty: 1437

Re: binarylogic's searchlogic vs. mislav-will_paginate

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.


http://tomash.wrug.eu/ - homepage & techblog
http://wrug.eu/ - Warsaw Ruby Users Group: spotkania i materiały z nich

Offline

 

#5 2009-10-03 14:51:38

hubertlepicki
Bywalec
Zarejestrowany: 2008-07-15
Posty: 228

Re: binarylogic's searchlogic vs. mislav-will_paginate

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


Hubert Łępicki
AmberBit ruby development company
http://amberbit.com
http://amberbit.pl

Offline

 

#6 2009-10-10 23:06:07

Yax
Obserwator
Zarejestrowany: 2009-08-26
Posty: 60

Re: binarylogic's searchlogic vs. mislav-will_paginate

Dokumentacja napisał:

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:

Kod:

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.

A tak po prostu?

Offline

 

#7 2009-10-11 06:22:19

gRuby
Obserwator
Od: Bruksela
Zarejestrowany: 2007-05-07
Posty: 67

Re: binarylogic's searchlogic vs. mislav-will_paginate

Yax napisał:

A tak po prostu?

w kontrolerze (explicite wink ):

Kod: ruby

  1. @my_condition = Item.whatever #named_scope
  2. @search = @my_condition.search(params[:search])
  3. @items = @search.all.paginate :page => params[:page], :per_page => 10

i w widoku bez zmian.

Ostatnio edytowany przez gRuby (2009-10-11 06:29:07)


bardzo fajna railsowa rzecz: http://gruby.soup.io/

Offline

 

Stopka forum

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson