1

项目位于

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

应用程序.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>
    
    4

    2 回答 2

    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
    

    如果你知道分数是 never nil,那么你可以这样做:

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

    如果您决定要使用其他方法来计算资源的总分,您可以更改aggregate_score.

    于 2013-09-08T01:57:22.287 回答
    0

    您显然需要 ActiveRecord 类的 order 方法

    Review.order("score")
    

    一篇文章也可能对您有所帮助。

    希望这可以帮助 :)

    编辑:

    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
    
    于 2013-09-08T00:08:51.937 回答