2013-11-05 19 views
6

Se si visita http://ccvideofinder.heroku.com/, è un buon esempio di ciò a cui mi riferisco.Come ordinare i film alfabeticamente in Rails?

Come può essere fatto in Rails? Stavo pensando magari usando le affermazioni case/when ma dopo un po 'di tempo con IRB non riuscivo a capirlo.


Nel modello:

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 

Nel regolatore:

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

'movies.sort'? – numbers1311407

+0

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

+0

è come se memorizzasse film nelle lettere .. a = ['ant vita', 'altro'], b = ['sala caldaia'] - questo è ciò che mi confonde. –

risposta

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') 

documentazione per ActiveRecord Interrogazione può essere trovato: http://guides.rubyonrails.org/active_record_querying.html#ordering


Se si desidera implementare l'ordine nella vostra find_by_first_letter definizione, allora si può semplicemente concatenare la funzione .order() come il seguente:

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

non riesco a capire il motivo per cui non stai utilizzando Query concatenamento:

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

Ma ancora meglio, creare un ambito come ha detto Michael Lynch, aumenterà la riusabilità del codice.

In realtà il codice sta dando un avviso di ritiro. È necessario verificarlo nella finestra del terminale del server Rails. Anche se funziona, non è una buona idea lasciarla deselezionata.

AVVISO DI DEPRESSIONE: la chiamata #find (: all) è obsoleta. Si prega di chiamare #all direttamente invece. Hai anche usato le opzioni di ricerca. Anche questi sono deprecati. Si prega di costruire un ambito invece di utilizzare le opzioni finder. (chiamato da irb_binding a (irb): 1)

+1

grazie, buona chiamata. –

Problemi correlati