Подтвердить что ты не робот

Как отсортировать массив объектов по атрибуту объектов?

Я выполняю этот запрос в контроллере, а модель '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}

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

4b9b3361

Ответ 1

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

users = users.sort_by &:lastname

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

users.sort_by! &:lastname

Ответ 3

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

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

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

Ответ 4

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