2013-06-06 1 views
4

Итак, у меня есть куча пользователей, у которых есть атрибуты user.dj_name. Это обоснованная необходимость в модели, но я все еще осторожна здесь, потому что у меня проблемы.NoMethodError для объекта nil на sort_by, и все объекты существуют

Я хочу получить кучу пользователей, а затем заказать их по их dj_name. Что-то вроде этого:

@djs = Event.all.map { |e| e.program.user }.sort_by {|x,y| x.dj_name <=> y.dj_name } 

где он тянет всех ди-джеев, у которых есть события (шоу). Она терпит неудачу с "NoMethodError: неопределенный метод` dj_name»для ноль: NilClass"

Так что я попытался:

@djs = Event.all.map { |e| e.program.user } 
@djs.compact.sort_by! {|x,y| x.dj_name <=> y.dj_name rescue nil} 

И это не сортирует. Без предложения «rescue nil» я получаю ту же ошибку.

И если я сделаю отказ! если объект равен нулю, я ничего не получаю.

> @djs.reject! {|d| d.nil? } 
=> nil 

Похоже, ни один из объектов в массиве равны нулю, механизм сортировки дает мне ошибки, и спасение это просто останавливает процесс сортировки и возвращает массив без изменений.

halp?

+0

Вы не должны использовать строку 'rescue' и' compact' в любом случае удаляет нильские элементы. – squiguy

+0

Ваша ошибка 'NoMethodError для nil object' сообщает вам, что объект, который вы пытаетесь отсортировать, пуст, поэтому, когда это выполняется, эта ошибка возникает. – David

+0

Это сошло с ума. Я не прокрутил вниз, чтобы увидеть последний ответ, который был правильным, и это то, что я делал. Я думаю, вы должны принять это вместо этого, поскольку он фактически решает вопрос. – you786

ответ

2

Используйте сортировку базы данных для выполнения такого рода задач. Вы можете возобновить свои запросы, используя:

Event.all(:include => {:program => :user}, :order => 'users.dj_name') 

Развязка этот запрос приведет к методу include делая вступать в ассоциации ваших моделей и order создания ORDER BY по Вашему запросу.

2

sort!, а не sort_by!.

sort_by! передает один аргумент в свой блок. Поэтому, когда вы звоните .sort_by! {|x,y| ... }, y всегда nil.

Целью sort_by! является сортировка по ключам вместо элементов. Блок получает один элемент и должен возвращать ключ элемента для использования для сортировки.

В этом коде:

@djs.compact.sort_by! {|x,y| x.dj_name <=> y.dj_name rescue nil} 

блок возвращает nil в качестве ключа для каждый элемента. В результате сортировка не происходит.

BTW, я согласен с @MurifoX, что в данном конкретном случае вы должны выполнить сортировку по базе данных.

Смежные вопросы