2013-11-05 11 views
6

Jeśli odwiedzasz numer http://ccvideofinder.heroku.com/, jest to dobry przykład tego, co mam na myśli.Jak sortować filmy alfabetycznie w Railsach?

Jak to zrobić w Railsach? Myślałem, że może używając instrukcji case/when, ale po tym, jak przez jakiś czas wygłupiałem się z IRB, nie mogłem tego rozgryźć.


W modelu

class Movies < ActiveRecord::Base 
    validates_presence_of :title 

    def self.find_by_first_letter(letter) 
    find(:all, :conditions => ['title LIKE ?', "#{letter}%"], :order => 'title ASC') 
    end 

end 

W regulatorze:

@result = Movie.find_by_first_letter(params[:letter]) 
+0

'filmy.sort'? – numbers1311407

+0

http://guides.rubyonrails.org/active_record_querying.html#ordering –

+0

to tak, jakby zapisywał filmy w literach .. a = ["życie mrówek", "inny"], b = ["kotłownia"] - to mnie wprawia w zakłopotanie. –

Odpowiedz

14
# Simple Ordering  
@videos = Movie.order('title ASC') 

# Implement the ordering outside of definition 
@videos = Movie.find_by_first_letter('a').order('title ASC') 

# Implement the order into your definition (as in example below) 
@videos = Movie.find_by_first_letter('a') 

Dokumentacja ActiveRecord odpytywanie można znaleźć: http://guides.rubyonrails.org/active_record_querying.html#ordering


Jeśli chcesz realizować zamówienie w swojej definicji find_by_first_letter, to może po prostu łańcuch funkcję .order() jak:

class Movie < ActiveRecord::Base 
    validates_presence_of :title 

    def self.find_by_first_letter(letter) 
    where('title LIKE ?', "#{letter}%").order('title ASC') 
    end 
end 
2

Nie mogę zrozumieć, dlaczego nie używając łańcuchowym zapytania:

Movie.where('title LIKE ?', "a%").order(:title) 

Ale jeszcze lepiej, stwórz zakres, jak powiedział Michael Lynch, zwiększy to możliwość ponownego wykorzystania kodu.

W rzeczywistości Twój kod zawiera ostrzeżenie o wycofaniu. Musisz to sprawdzić w oknie terminala serwera Rails. Chociaż to działa, nie jest dobrym pomysłem, aby pozwolić temu odejść niezaznaczonemu.

OSTATECZNE OSTRZEŻENIE: Wywołanie funkcji #find (: all) jest przestarzałe. Zamiast tego zadzwoń bezpośrednio na #all. Użyłeś również opcji wyszukiwarki. Są one również przestarzałe. Utwórz zasięg, zamiast korzystać z opcji wyszukiwania. (wywołane z irb_binding w (irb): 1)

+1

dzięki, dobry telefon. –