2010-08-16 16 views
6

J'ai une liste de sélection dans mon modèle qui énumère un certain nom des personnes avec leur nom d'employeurs:Rendre la sortie de la liste de sélection dans l'ordre alphabétique dans Rails?

<li>Case Handler Name<span><%= f.select :person_id, Person.all.collect { |x| [x.name_and_company, x.id] } %></span></li> 

def name_and_company 
return "#{personname} (#{company})" 
end 

Est-il possible de forcer la liste de sélection à la sortie dans l'ordre alphabétique?

Je suppose que je mettrais une étiquette de commande là-dedans ... quelque part?

(:order => 'personname DESC') 

Merci,

Danny

Répondre

10

Vous pouvez le faire comme ça

# controller 
@people = Person.order_by('personname ASC').collect {|x| [x.name_and_company, x.id] } 

# model 
named_scope :order_by, lambda { |o| {:order => o} } 

# view 
<%= f.select :person_id, @people %> 
+0

Salut J. Si j'utilise ci-dessus dans la vue Kase, devrait-il être dans le contrôleur de personnes ou le contrôleur de Kase? En outre, la section du contrôleur de votre code va-t-elle dans le bloc def create? Merci. – dannymcc

+0

Si la vue correspond à l'action d'un contrôleur de Kase, elle devrait être dans cette même action sur le contrôleur de Kase. –

8

Réponse:

#users_controller.rb 
    def index 
     @people = Person.alphabetically 
    end 

    #user.rb 
    scope :alphabetically, order("name ASC") 

    #index.haml 
    = f.select :person_id, @people.all.collect { |p| [p.name, p.id] } %> 
4

Encore plus facile ...

<%= f.select :name, options_from_collection_for_select(Person.order("name ASC"), :name, :name), :prompt => 'Select' %> 

Note: Ne nécessite pas des méthodes personnalisées ou des ajouts au contrôleur