2013-09-07 4 views
1

Проект находится вСортировку на основе отношений has_many

http://code-dojo.herokuapp.com/

и

https://github.com/TylerSangster/Code-Dojo

У меня есть сайт обзор ресурсов со следующими моделями.

class Resource < ActiveRecord::Base 

    has_many :reviews 


class Review < ActiveRecord::Base 

    belongs_to :resource 

Я добавил сортировку ресурсов по названию, созданному по цене и стоимости. Я также хотел бы отсортировать по самому высокому ресурсу.

Как я могу создать сортировку через review.score?

РЕДАКТИРОВАТЬ контроллер ресурсов

def index 
    @resources = Resource.where(status: true).includes([:providers, :subjects, :formats, :reviews]) 
    @resources = @resources.tagged_with(params[:tag]) if params[:tag] 
    @resources = @resources.order(sort_column + " " + sort_direction) 
    @resources = @resources.paginate(:page => params[:page], :per_page => 10) 


    respond_with @resources 
    end 

частные методы

def sort_column 
    Resource.column_names.include?(params[:sort]) ? params[:sort] : "name" 
    end 

    def sort_direction 
    %w[asc desc].include?(params[:direction]) ? params[:direction] : "asc" 
    end 

application.rb

def sortable(column, title = nil) 
    title ||= column.titleize 
    css_class = column == sort_column ? "current #{sort_direction}" : nil 
    direction = column == sort_column && sort_direction == "asc" ? "desc" : "asc" 
    link_to title, {:sort => column, :direction => direction}, {:class => css_class} 
    end 

index.html.erb

  • <% = сортировкой "имя" %>
  • <li><div class="btn btn-default"><%= sortable "created_at", "Most Recent" %></div></li> 
        <li><%= link_to "Highest Rated", resources_path, class:"btn btn-default" %></li> 
        <li><div class="btn btn-default"><%= sortable "cost" %></div></li> 
    
    +2

    Если у каждого ресурса много отзывов, как вы хотите заказать их с помощью 'review.score', так как в каждом обзоре есть много из них? Возможно, суммой? – lurker

    ответ

    2

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

    Логичным выбором может быть суммирование итогов обзора ресурса для создания совокупной оценки ресурса.Она будет работать, как это (при условии, @resources представляет собой совокупность ресурсов активных записей):

    @resources.sort_by(&:aggregate_score) 
    

    Самый высокий рейтинг будет последним элементом:

    highest_score_resource = @resources.sort_by(&:aggregate_score).last 
    

    В модели ресурсов, определить aggregate_score:

    def aggregate_score 
        self.reviews.select { |r| r.score }.sum(&:score) 
    end 
    

    Если вы знаете, что баллы никогда nil, то вы могли бы сделать:

    def aggregate_score 
        self.reviews.sum(&:score) 
    end 
    

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

    +0

    Большое вам спасибо. – Tyler

    +0

    Последнее, что я хочу, чтобы превратить это в кнопку, как бы вы это сделали? – Tyler

    +0

    @ Тайлер, рад, что это помогает. Кнопка - это совсем другое. Вы хотите, чтобы что-то произошло в представлении при нажатии кнопки? – lurker

    0

    Вы, очевидно, нужен метод заказа ActiveRecord класса

    Review.order("score") 
    

    Существует article, что может помочь вам тоже.

    Надеется, что это помогает :)

    EDIT:

    class Resource < ActiveRecord::Base 
        scope :ordered, :order => "some_col DESC" 
    end 
    
    class Review < ActiveRecord::Base 
        has_many :resources 
    end 
    
    review.resources # uses the default ordering 
    review.resources.ordered # uses the "some_col DESC" ordering 
    
    +0

    Я НЕ пытаюсь заказать отзывы .... – Tyler

    +0

    Мне нужно заказать ресурсы на основе Обзоров. – Tyler

    +0

    О, извините, я не понял вопрос правильно, проверьте мой отредактированный ответ ... это должно быть полезным, пожалуйста, нажмите кнопку «Принять», если да :) –

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