Witam,
ostatnio bawię się w ror i jakoś zawsze znajdowałem rozwiązanie napotkanych problemów, ale z jednym nie mogę dać sobie rady, bo nawet nie wiem w jakiej metodzie szukać rozwiązania. Chodzi mi o taki problem, powiedzmy że mam dwie tabele w bazie - actors i movies - i teraz na stronce danego actora chcę mieć linki odwołujące się do movie w jakim grał, robię to przez link_to, ale nie wiem już jak link_to manipulować - przynajmniej zrobić, żeby wyświetlały się w określonym przeze mnie porządku, ilości, może nawet jakieś stronicowanie gdybym miał ich za dużo, a chce aby były wszystkie… niby wydaje się proste, ale nie wiem jak się za to zabrać. Może ktoś poświęci chwilę i mnie oświeci. Z góry dzięki.
Model#find (okolice :order) a do stronicowania Paginator
I najlepiej zainstaluj gem paginator. Jest dużo wydajniejszy od standardowej paginacji.
ale chyba ma nie kompatybilne API ? Chyba ze znalalem cos innego O tym mowisz ? http://paginator.rubyforge.org/
Pozdrawiam
Pawel
Oczywiście metody tutaj podane Model.find(:order, :limit itd…), przećwiczył już przy pierwszym kontakcie z ror jakiś czas temu i świetnie się sprawdzają z pracowaniem nad jedną tabelą w bazie, ale sprawa zaczyna się komplikować, gdy z jednej tabli chcemy wyciągnąć konkretne dane przez jakiś id odwołujący się do innej tabeli, w tym przydatku (jaki wyżej podałem) gdy chcemy do strony o actor wyciągnąć z tabeli movies, movie w jakich grał i np. poszeregować to przez datę realizacji filmu, tutaj mogę wyciągnąć te dane przez link_to, ale nie mogę ich szeregować według uznania, będzie coś takiego - wprowadzę nowy movie, który będzie przypisany do id actora i na jego stronie znajdzie się link na końcu grupy linków movie, w których grał i klops, nie mogę tego szeregować według uznania przez metodę :order, żeby był ciekawiej to nawet to działa, ale wystarczy zrestować serwer, czy z killować procesy, aby było po zabawie i cały cykl który był do resetu wprowadzony zachowuje się i zaczyna nowy, normalnie zagadka, bo wyobrażam sobie, że za każdym razem z bazy są pobierane dane, a nie w jakiś magiczny sposób “konserwowane” na stronie.
Dodam jeszcze, że dane z movies wyświetlają się tak jak chcę (do momentu resetu serwera) jeżeli całą tabel movies uporządkuje pod pożądany przeze mnie element, co naturalnie jest tylko półśrodkiem.
Nie wiem jak masz to zorganizowane i jak chcesz dalej na tym operowac ale zasada jest mniej wiecej taka:
[code=ruby]actor = Actor.find(1, :include => :movies, :order => “movies.year DESC”)
jakis kod
actor.movies.each { |movie|
iteracja
}[/code]
ew wersja hardcorowa:
[code=ruby]actor = Actor.find(1)
jakis kod
actor.movies.sort! { |a,b| a.year <=> b.year }
actor.movies.each {
#iteracja
}[/code]
Pierwszy przyklad przerzuca sortowanie na engine bazy danych, natomiast drugi na aplikacje.
ruthrc pozwól, że ci się pokłonię i oddam cześć, oto chodziło, działa pięknie i będę miał w końcu spokojnie przespaną noc Dzięki piękne.
Tak, to ten do którego linka podałeś, ale…
z czym niekompatybilne?
bo ja coś chyba przeoczyłem w takim razie.
[quote=drogus]z czym niekompatybilne?
bo ja coś chyba przeoczyłem w takim razie.[/quote]
Z oryginalnym paginatorem, railsowym ?
masz jeszcze jedną zagwozdkę, czy ma ktoś pomysł jak do tego zaczepić jeszcze limit
[code=ruby]actor = Actor.find(1, :include => :movies, :order => “movies.year DESC”)
jakis kod
actor.movies.each { |movie|
iteracja
}[/code]
proste wpisanie :limit (np) => 10, nie zdaje egzaminu, :order chodzi pięknie
Ach, w ten sposób. No rzeczywiście niekompatybilne, ale nie przeszkadza mi to w żaden sposób, a z tego co wyczytałem działa szybciej niż domyślna paginacja.
[code]>> group = Group.find(:first)
group.rights.length
=> 107group.rights.find(:all, :limit => 10).length
=> 10[/code]
Przykłd z pierwszej z brzegu aplikacyjki na dysku.
Update: teraz zauważyłem, że chciałeś wrzucić to do tego pierwszego find’a. Jak zrobisz limit => 10, to odnosi się to do actora, a nie filmów. Jak to zaaplikować do filmów w jednym find, nie wiem - w SQL’u zbyt mocny nie jestem
Dokładnie, chodzi w tym przykładzie o wyciągnięcie movie actora z limitem, szperam po necie, ale bez rezultatów, co dziwne, bo w sumie przykład wydaje się powinien często być używany, jak np. w tym http://forum.rubyonrails.pl/viewtopic.php?id=429 gdyśmy chcieli wywołać posty jakiegoś usera z limitem, co wydaje się rozsądne jeżeli będą ich setki
Żeby zamknąć ten wątek, oczywiście wystarczy dopisać sqlowski LIMIT i po kłopocie
@actor = Actor.find(params[:id], :include => :movies,
:order => "movies.year DESC LIMIT x")
[quote=Tommy]Żeby zamknąć ten wątek, oczywiście wystarczy dopisać sqlowski LIMIT i po kłopocie
@actor = Actor.find(params[:id], :include => :movies,
:order => "movies.year DESC LIMIT x")
[/quote]
bleeeeeeee, bardzo brzydkie rozwiazanie… Zupelnie nie RailsWay i podejzewam ze moze powodowac problemy przy jakis akcjach w stylu AR#scope itd
Pozdrawiam
Pawel
Na razie musi styknąć, zobaczymy jak będzie, chętnie oczywiście skorzystam z rails-way jak ktoś ją przedstawi.
A nie brakuje Ci przypadkiem tabeli roles i modelu Role?
to jest tylko przykład, u mnie bardziej chodzi o usera i jak wyciągać pewne dane, które wprowadza, nevermind
[quote=Tommy]Żeby zamknąć ten wątek, oczywiście wystarczy dopisać sqlowski LIMIT i po kłopocie
@actor = Actor.find(params[:id], :include => :movies,
:order => "movies.year DESC LIMIT x")
[/quote]
Zgadzam sie z ruthrsc, to jest bleeeeeeee. Zapoznaj się z dokumentacją: find
Person.find(:all, :offset => 10, :limit => 10)
Dla obsługi dwóch tabel używasz parametru :include
Zanim kolejny będzie pisać o swoim odruchu wymiotnym, niech spróbują doczytać o co chodzi, sprawa się ma tak, że wszystko się rypie po :orderze, on nam wyciąga porządek z drugiej tabeli, a reszta dopisanych metod będzie się odnosić do pierwszej czyli do wywoływanego konkretnego Person, a całość idzie w jednym zapytaniu, może da się do rozpisać na więcej zapytań, nie wiem, może zacząć jeszcze z innej strony, ja się da, to byłoby super.