Как отсортировать массив объектов по атрибуту объектов? - PullRequest
34 голосов
/ 06 января 2011

Я выполняю этот запрос в контроллере, и модель 'Group' has_many Users

@group= Group.find(params[:id])

@ group используется для визуализации этого частичного (частичное сбрасывает пользователей группы в таблицу)

<%= render :partial=>"user_list", :locals=>{:users=>@group.users} %>

Локальная переменная 'users', переданная в партиал, является массивом объектов 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'?Я попробовал несколько разных способов без какой-либо удачи.Попытка сортировать по атрибуту объекта внутри массива в замешательстве меня.Кроме того, я не понимаю, как я могу сделать это с помощью: order в запросе (как: упорядочить не группу, а пользователей каждой группы)?

Может быть, я не имею в виду имяобъект правильно («Пользователь»)?Кажется, что это должно работать, если оно выдает ошибку «no method» (или ошибку назначения динамической константы, если «sort_by» используется без!):

 users.sort_by! {|User| User.lastname}

Спасибо за любую помощь.

Ответы [ 4 ]

35 голосов
/ 06 января 2011

Я нашел метод, который работает с здесь .Я не понимаю, что делает символ «&» - может быть, это короткий термин для «объекта», так как в моем случае «: lastname» является атрибутом объекта, который составляет массив.

users = users.sort_by &:lastname

примечание: я не понимаю, почему, но разрушительная версия не будет работать.Он производит "неопределенный метод` sort_by! 'за # "ошибка:

users.sort_by! &:lastname
30 голосов
/ 06 января 2011

См. 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 }
15 голосов
/ 06 января 2011

Это, вероятно, потому что у вас есть |User|, когда User является классом.Попробуйте изменить его на неиспользуемое имя переменной, например u, чтобы получить:

 users.sort_by! {|u| u.lastname}

Термин между каналами - это имя переменной, в которой хранится каждый элемент, когда он проходит,не тот тип объекта, который у вас есть.Это то же самое, что и другие блоки Ruby, такие как do || end или любой другой блок {||} в стиле.

2 голосов
/ 06 января 2011

Вы можете попробовать поместить предложение порядка в строку "has_many: users", которая есть в вашей модели группы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...