2013-05-03 4 views
1

У меня есть метод на моей модели User.rb в моем приложении Rails, который возвращает оценку репутации на основе различных вкладов пользователя на сайт.Как отсортировать результаты по методу

def total_votes 
    answerkarma = AnswerVote.joins(:answer).where(answers: {user_id: self.id}).sum('value') 
    contributionkarma = Contribution.where(user_id: self.id).sum('value') 

    answerkarma + contributionkarma 
    end 

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

def index 


    if params[:province_id] 
    province = params[:province_id] 
    province = province.to_i 
    @artistsbyprovince = User.artists_by_province(province) 

    else 

    @artists = User.where(:onionpealer => true) 

    end 


    end 

Если я фильтрация по местоположению, модель пользователя вызывает этот метод сфера

scope :artists_by_province, lambda {|province| 
     joins(:contact). 
     where(contacts: {province_id: province}, 
      users: {onionpealer: true}) 
     } 

То, что я хотел бы сделать, однако, в обоих случаях (будь то фильтрация по местоположению или извлечения всех пользователей), чтобы отсортировать выборку художников по результатам метода total_votes, чтобы художники с наибольшим количеством точек отображались вверху.

Можете ли вы предложить, как я могу это сделать. Заранее спасибо.

ответ

1

Если не обращать внимание на неправильной архитектуре запросов, сортировка может быть сделано с помощью рубина array#sort_by

@artistsbyprovince = User.artists_by_province(province).sort_by{ |u| -u.total_votes } 
+0

Спасибо, но одна проблема. Он возвращает пользователей с большинством голосов внизу. Они должны быть наверху. Кроме того, что вы имеете в виду, когда говорите «Если не обращать внимание на неправильную архитектуру запросов», я не понимаю. – Leahcim

+0

Обновите мой ответ, чтобы изменить направление сортировки – MikDiet

+0

Я имею в виду, если у вас много пользователей, скажем 10000 ++, извлечение их из db и упорядочение по голосам в ruby ​​будет очень длинным, а операционная память будет работать. Правильный путь - кеширование голосов в базе данных и упорядочение в sql-запросе. – MikDiet

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