Pisze i nic nie rozumie (find_all_by)

Witam jestem obecnie w trakcie kursu z Saas edx-u. Ale muszę przyznać że choć nauka idzie mi strasznie :frowning: znajduję odpowiedzi w goodlach ale głowa jakoś nie ogarnia tematu. Oto przykład.

Częścią zadania jest wyświetlanie listy filmów wg. zaznaczonych raitingów oraz możliwość ich sortowania wg. Nazwy i daty produkcji.

Działający kod wygląda u mnie tak:

@movies = Movie.find_all_by_rating(@selected, :order => params[:sort])

Ogarniam wszystko poza tym, skąd do jasnej anielki railsy wiedzą, że hash :order => params[:sort] jest funkcją order ??

Przepraszam z góry za tendencyjność pytania ale staram się załapać jakieś podstawowe mechanizmy a railsy cały czas mnie zaskakują.

Hash, to hash, a więc :order => params[:sort] nie jest funkcją. Funkcją, generowaną w sposób dynamiczny, jest natomiast find_all_by_rating, która jako drugi parametr przyjmuje hash, którego jednym z kluczy może być symbol :oder, a wartością atrybut, po którym odbywa się sortowanie.

Przy okazji: powyższa struktura nie jest idiomatycznym sposobem tworzenia zapytań w obecnej wersji Railsów. Lepiej byłoby:

@movies = Movie.where(rating: @selected).order('params[:sort])

A jest gdzieś pełna lista symboli jakie może przyjąć ten hash arugmentów ?

Swoją drogą dzięki za to że pokazałeś jak to może być po ludzku napisane :slight_smile: Twój przykład od razu bym załapał.

Dzięki

Myślę, że tutaj będzie można coś znaleźć:

API Rails 3.2 ActiveRecord/Base albo ActiveRecord/FinderMethods

Jednak, jeśli mogę coś radzić, to nie warto uczyć się tej starej składni, bo w Rails 4.0.x jest oznaczona jako “deprecated”, a w 4.1x chyba w ogóle usunięta.

Nie mam zamiaru uczyc się 3.2 ale na czas kursu jestem uwiązany, niestety.