To moja pierwsza praca w RoR, mająca jakiekolwiek praktyczne zastosowanie, zatem proszę o cierpliwość. Chcę podzielić długą listę linków-nazwisk na listy nazwisk zaczynających się od kolejnych liter alfabetu i dodać stronę z linkami do każdej z tych list. Dobrze by było gdyby ta strona nie była tylko ciągiem linków-liter ale zawierała linki złożone z pierwszego i ostatniego nazwisko na daną literę, tzn.:
Niestety jeszcze nie dla mnie Jeżeli mój dodtychczasowy widok wyglądał tak jak poniżej, to co w nim należy zmienić, żeby w ogóle coś się wyświetliło? Przy okazji: dlaczego “authors” a nie “@authors”?
Małe i duże litery są traktowane jako osobne grupy.
Kolejność liter jest przypadkowa.
W bazie mam dane w unikodzie, co nie było żadnym problemem do momentu (tak myślę) dopóki nie była używana funkcja chr która pewnie nie ma o tym bladego pojęcia, (a w perlu byłoby tak łatwo i sortuje według pierwszego bajtu. Skutek jest zabawny np:
�
Ćwikliński Zefiryn
Ćmelik
a powinno być :
Ć
Ćwikliński Zefiryn
Ćmelik
Jedna sprawa to powyższe problemy a druga, to to, że taka lista nie za bardzo nadaje się do użytku w moim przypadku (ponad 4500 nazwisk i będzie więcej). Zatem pozostaje pytanie jak zrobić indeks z samymi literami (a raczej pierwszymi i ostatnimi nazwiskami na daną literę ) z którego wchodziłoby się na strony z nazwiskami zaczynającymi się na jedną literę (obawiam się że te strony też przydałoby się podzielić w niektórych przypadkach na mniejsze).
A co z tym ??? Guide: Things You Shouldn’t Be Doing In Rails Tam grożą śmiercią lub kalectwem w przypadku używania “built-in pagination”. Wolę nie ryzykować. Poza tym podział na strony o określonej wielkości musi nastąpić dopiero po podziale na strony nazwisk na konkretną literę. :order w find nie zadziała bo potem jest group_by która to metoda zwraca hasha, a ten jak wiadomo ze swej natury nie jest nijak posortowany.
I zadziałało. Do pewnego stopnia niestety. Nazwiska są pogrupowane na A,B,C itd. ale na końcu jest:
�
Überrück Wilhelm
�
Ćwikliński Zefiryn
Ćmelik
�
Łaszczyński Bolesław
Łukaszewicz Józafat Ignacy
Żmurko Franciszek
Świeykowski Aleksander
Żukowski Stanisław
Łoś Waldemar
[…]
Ruby nie ma wciąż dobrej biblioteki Unicode (tak jak Python), więc w Ruby trzeba się męczyć. Ale zdecydowanie najlepiej zwalić sortowanie na bazę zamiast na Rubiego. A w bazie ustaw polskie collations to będzie trzymać się reguł jęz. polskiego. Wtedy wystarczy proste:
[quote=radarek]Natknąłem się na coś takiego, jednakże nie sprawdzałem. Można spróbować: http://snippets.dzone.com/posts/show/2786[/quote]
To wszystko badziewie. Implementację UTF-8 w Railsach od 1.2 daje Multibyte, ale to też badziewie. UTF-8 to wciąż tylko ciąg bajtów, nie zawiera w sobie informacji o języku aby trzymać się jego reguł. Co mi z tego, że metoda size() rozpozna ilość znaków. A co z sortowaniem? Np. z tekstu kodowanego w UTF-8 nie wynika, czy mają być uwzględniane reguły języka polskiego, rosyjskiego, czeskiego czy japońskiego. A Python to potrafi, bo operuje na obiektach unikodowych które mogą przechowywać taką informację. I dzięki temu można tak samo traktować duże i małe znaki w operacjach na tekście (włącznie z wyrażeniami regularnymi). Dlatego, jeśli ktoś chce porządnie sortować teksty którze i tak trzyma w bazie, niech użyje do tego bazy z ustawionymi regułami językowymi (chodzi o opcję collations). Z Ruby trzeba poczekać do wersji 2.0 która dopiero wtedy będzie mieć zaimplementowany Unicode.