62 votes

Comment commander un has_many par association à Ruby on Rails?

Étant donné les suivants AR modèles, je voudrais trier les utilisateurs par ordre alphabétique par nom de famille lors d'une poignée à une tâche:

#user
has_many :assignments
has_many :tasks, :through => :assignments    

#assignment
belongs_to :task
belongs_to :user

#task
has_many :assignments
has_many :users, :through => :assignments

Je voudrais obtenir une tâche de navigation de ses utilisateurs assignés, et de trier la liste par ordre alphabétique.

Je continue à penser que je devrais être en mesure d'ajouter l' :order clause d' has_many :users, :through => :assignments comme ceci:

#task.rb
has_many :assignments
has_many :users, :through => :assignments, :order => 'last_name, first_name'

toutefois, cela ne fonctionne pas.

Comment trier les utilisateurs en last_name lors d'une tâche?

72voto

Daniel Points 1098

Comme les arguments de condition sont obsolètes dans Rails 4, il convient d’utiliser des blocs de portée:

 has_many :users, -> { order 'users.last_name, users.first_name' }, :through => :assignments
 

37voto

M.G.Palmer Points 1312

Cela fonctionne pour moi:

 has_many :users, :through => :assignments, :order => 'users.last_name, users.first_name'
 

12voto

denis.peplin Points 1648

L'approche M.G.Palmer's fonctionne bien, mais le nom de la table est impliqué. Il y a une meilleure façon de le faire:

 has_many :users, :through => :assignments, :order => [ :last_name, :first_name ]
 

6voto

Antony Sastre Points 395

Est-ce que cela fonctionnerait pour vous?

 # User.rb

class User < ActiveRecord::Base
 default_scope :order => 'last_name ASC'
 ...
end
 

Vous pouvez définir d'autres étendues nommées lorsque le tri doit être différent.

http://ryandaigle.com/articles/2008/11/18/what-s-new-in-edge-rails-default-scoping

2voto

Yogzzz Points 632

Vous pouvez également créer une nouvelle colonne 'sort_order' sur la table d’attribution et ajouter une étendue par défaut telle que

 default_scope { order('sort_order desc')}
 

à votre modèle de missions.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X