2015-06-15 2 views
1

У меня есть метод в Business, который является методом certified?.Сортировка по методу ассоциации

Я хотел бы отсортировать Quotation модель используя certified? способ.

Возвращаемое значение этого метода является булевым. Поэтому, чтобы отсортировать его, я бы хотел, чтобы сертифицированные предприятия были наверху списка.

Вот ассоциации:

Business принадлежит Quotation

Вот как я это делаю сейчас:

Quotation.by_biz_id(biz.id).includes(:business).sort_by {|quote| quote.business.certified? <=> quote.business.certified? }

Как вы можете видеть, что есть много метода построения цепочки в нем. Есть ли новый и лучший способ реорганизации кода?

Особенно повторяющееся условие: {|quote| quote.business.certified? <=> quote.business.certified?}

Если удалить условие <=>, ошибка что-то вроде этого:

ArgumentError: comparison of FalseClass with true failed

+0

Является ли это 'сертифицированным' поле в вашей таблице' business', или * регулярном * Ruby-методе? –

+0

Это обычный метод. И он возвращает логическое значение. –

+1

Мой ответ был неверным. Вот хороший пример того, что вам нужно сделать: http://stackoverflow.com/questions/8737111/sort-by-with-boolean-in-rails –

ответ

0

Вы также можете использовать group_by вместо сортировки, как,

Quotation.includes(:business).group_by do |quote| 
    quote.business.certified? ? "certified" : "not_certified" 
end 

Он вернет Hash contai в качестве certified со значениями сертифицированной бизнес-котировки и остальными в not_certified.

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