Как отсортировать массив объектов по атрибуту объектов?
Я выполняю этот запрос в контроллере, а модель 'Group' has_many Users
@group= Group.find(params[:id])
@group используется для рендеринга этого частичного (частичные дампы пользователей группы в таблицу)
<%= render :partial=>"user_list", :locals=>{:users=>@group.users} %>
Локальная переменная 'users', переданная в partial, представляет собой массив объектов User;
- !ruby/object:User
attributes:
updated_at: 2011-01-04 21:12:04
firstname: Bob
lastname: Smith
id: "15"
group_id: "2"
created_at: 2010-11-26 12:54:45
Как сортировать пользовательский массив по 'lastname'? Я пробовал несколько разных способов без везения. Попытка сортировать по атрибуту объекта внутри массива, запутывая меня. Кроме того, я не согласен с тем, как я мог сделать это с помощью: порядка в запросе (как: заказывать не группу, а пользователей каждой группы)?
Возможно, я не имею в виду имя объекта правильно ( "Пользователь" )? Похоже, что это должно сработать, если оно выдает ошибку "нет метода" (или динамическую ошибку с постоянным присваиванием, если "sort_by" используется без!):
users.sort_by! {|User| User.lastname}
Спасибо за любую помощь.
Ответы
Ответ 1
Я нашел метод, который работает от здесь. Я не понимаю, что такое "&" символ - возможно, это shorthad для "объекта", поскольку в моем случае ": lastname" является атрибутом объекта, который составляет массив.
users = users.sort_by &:lastname
Примечание: я не понимаю, почему, но разрушительная версия не будет работать. Он создает метод undefined `sort_by! ' для # "errror:
users.sort_by! &:lastname
Ответ 2
См. http://ariejan.net/2007/01/28/ruby-sort-an-array-of-objects-by-an-attribute/
@users.sort! { |a,b| a.name.downcase <=> b.name.downcase }
Ответ 3
Вероятно, у вас есть |User|
, когда User
- это класс. Попробуйте изменить его на имя неиспользуемой переменной, например u
, чтобы получить:
users.sort_by! {|u| u.lastname}
Термин между трубами - это имя переменной, в которой каждый элемент хранится, как он проходит, а не тип объекта, который у вас есть. Это то же самое, что и другие блоки Ruby, такие как do || end
или любой другой {||}
-стильный блок.
Ответ 4
Вы можете попробовать поставить предложение заказа в строке "has_many: users", которая у вас есть в модели Group