2017-01-31 15 views
1

У меня есть таблица пользователей, и у меня есть рейтинг репутации для каждого пользователя. Счет репутации является комбинированный оценка от 2 факторов:Rails scope, который заказывает пользователей по оценке репутации

  1. полных последователей по проектам пользователей (проекты он/она создала)

  2. общего количества голосов на задачи пользователей (задачи, которые он/она создала)

Моя цель - разрешить пользователям фильтровать пользователей самым последним (стандартное действие индекса) или пользователями с наибольшей репутацией. Какая область Rails вернет список пользователей, заказанных по этой «общей оценке репутации», в порядке наивысшего балла до самого низкого? ТНХ,

Мой код выглядит следующим образом:

User.RB Model

def total_reputation_score 
    project_follower_count + task_vote_count 
end 

scope :by_reputation, -> { #HOW DO I CREATE THIS SCOPE? } 
контроллер

Пользователи

def index 
    @users = User.text_search(params[:query]).paginate(page: params[:page], :per_page => 12) 
end 

    def most_reputation 
    @users = policy_scope(User) 
    @users = @users. 
     text_search(params[:query]). 
     by_reputation. 
     paginate(page: params[:page], :per_page => 12) 

    render :index 
    end 

ответ

3

В то время как вы можете сделать это в SQL на лету, вам действительно хотят:

Добавить counter cache для каждого из двух пунктов счета, показанных здесь; это добавляет их как вычисляемые столбцы, что Rails будет поддерживать для вас, то сделать это за рамки:

User.order(User.arel_table[:project_follower_count] + User.arel_table[:task_vote_count]).reverse_order 

(или что-то подобное)

В качестве альтернативы вы можете удвоить вниз на РСУБД и строить из индексов для обработки на лету.

+0

спасибо corey - так, чтобы убедиться, что я понимаю ... это просто вопрос добавления нового целочисленного поля в таблицу Users для project_follower_count, а также для task_vote_count. Затем, когда у меня есть те, которые я могу просто сделать: scope: by_reputation, -> {User.order (User.arel_table [: project_follower_count] + User.arel_table [: task_vote_count] .reverse_order} – BB500

+0

- это правильно, или мне даже не нужно масштаб больше? – BB500

+0

Также я читаю здесь (и еще пару других мест), что встречные тайники не подходят для многих-многих отношений. Мои последователи и подсчет голосов и т. Д. Связаны друг с другом has_many -> через отношения. Можете ли вы использовать счетчик кеша со многими? https://coderwall.com/p/muvy9w/forget-counter-cache-for-many-to-many-associations-in-rails – BB500