在索引 Ruby on Rails 和 Raty.js 中显示 pin/post 平均评分

Posted

技术标签:

【中文标题】在索引 Ruby on Rails 和 Raty.js 中显示 pin/post 平均评分【英文标题】:Show pin/post average rating in index Ruby on Rails and Raty.js 【发布时间】:2015-04-19 19:14:13 【问题描述】:

我使用 Ruby on Rails 和 Raty.js 为我的图钉创建了一个评级系统。您可以在各个显示页面中查看每个图钉的平均评分。我想将它合并到我的索引文件中。目前,在索引中显示的所有 pin 的评分是第一个 pin 的平均评分。

注意:我使用 Haml 作为索引文件,但如果你能在基本的 html 中提供答案,那就没问题了。

index.html.haml:

.panel-footer
  .btn-group.pull-left
    %divclass: "srating", dscore: @avg_review 

:javascript
    $('.srating').raty(
        path: '/assets/',
        readOnly: true,
        score: function() 
            return $(this).attr('dscore');
        
    );

pins_controller.rb:

class PinsController < ApplicationController
    before_action :find_pin, only: [:show, :edit, :update, :destroy, :upvote, :un_upvote]
    before_action :authenticate_user!, except: [:index, :show]

    def index
        @pins = Pin.all.order("created_at DESC").paginate(page: params[:page], per_page: 7)
        for singlepin in @pins
            @stars_reviews = StarsReview.where(pin_id: singlepin.id)

            if @stars_reviews.blank?
                @avg_review = 0
            else
                @avg_review = @stars_reviews.average(:rating).round(2)
            end
        end
    end

【问题讨论】:

您的问题是什么?你没有说明你遇到了什么问题。 我想显示索引中每个引脚的平均引脚评级 【参考方案1】:

它实际上显示的是最后一个 pin 的平均评分。

for singlepin in @pins
  @stars_reviews = StarsReview.where(pin_id: singlepin.id)

  if @stars_reviews.blank?
    @avg_review = 0
  else
    @avg_review = @stars_reviews.average(:rating).round(2)
  end
end

这里的每个循环只是将一个变量设置为新值。

所以要么在 pin 上添加一个平均评分属性,然后在每次有人评分时更新它。

或者将变量设为数组:

@avg_reviews = []
for singlepin in @pins
  @stars_reviews = StarsReview.where(pin_id: singlepin.id)

  if @stars_reviews.blank?
    @avg_reviews << 0
  else
    @avg_reviews << @stars_reviews.average(:rating).round(2)
  end
end

然后在你遍历引脚时输出

<% @pins.each_with_index do |pin, i| %>
  %divclass: "srating", dscore: @avg_reviews[i] 
<% end %>

或者您可以允许您设置的 pin 上的属性

class Pin
  attr_accessor :avg_review
end

for singlepin in @pins
  @stars_reviews = StarsReview.where(pin_id: singlepin.id)

  if @stars_reviews.blank?
    singlepin.avg_review = 0
  else
    singlepin.avg_review = @stars_reviews.average(:rating).round(2)
  end
end

然后在视图中访问它

<% @pins.each do |pin| %>
  %divclass: "srating", dscore: pin.avg_review 
<% end %>

【讨论】:

以上是关于在索引 Ruby on Rails 和 Raty.js 中显示 pin/post 平均评分的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Ruby on Rails 迁移中使列唯一并为其编制索引?

Stripe checkout form - 页面上的表单索引 - Ruby on Rails

Ruby on rails,改变最近创建的脚手架

Elasticsearch 的_msearch介绍及在ruby on rails 中的使用

Ruby on Rails 在现有资源上返回 404

Ruby on Rails 高级 JSON 序列化