如何在索引页面中显示Avarage评级?

时间:2018-03-16 12:56:04

标签: ruby-on-rails ruby

我试图在我的索引页面上显示作业的平均评分,它在show page

上完全正常

但是在我的索引页面上,星星在那里但是blank,我如何让它们显示在我的索引页面上?

我的展示页面:

    <h4>Average Rating</h4>
<div class="average-review-rating" data-score=<%= @average_review %>></div>
<span class="number-of-reviews">Based on <%= @job.reviews.count %>  reviews</span>
</div>
    </div>

<script>

$('.review-rating').raty({
        readOnly: true,
        score: function() {
            return $(this).attr('data-score');
        },
        path: '/assets/'
    });

    </script>

    <script>
        $('.average-review-rating').raty({
            readOnly: true,
            path: '/assets/',
            score: function() {
                return $(this).attr('data-score')
            }
        });
    </script>

乔布斯显示控制器

def show


        if @job.reviews.blank?
            @average_review = 0
        else
        @average_review = @job.reviews.average(:rating).round(2)

        end

    end

我的索引页:

 <% @jobs.each do |job| %>
        <%= link_to job.title, job_path(job) %></h4>
        <%= job.category %></p>
        <%= job.city %>
        <div class="average-review-rating" data-score=<%= average_review %>></div>   
        <span class="number-of-reviews">Based on <%= job.reviews.count %>  reviews</span>               
            </div>
         </div>
       <% end %>

        <script>
            $('.average-review-rating').raty({
                readOnly: true,
                path: '/assets/',
                score: function() {
                    return $(this).attr('data-score')
                }
            });
        </script>

2 个答案:

答案 0 :(得分:1)

在您的节目页面中,您定义了@average_review。我猜测这是在show action中的作业控制器中完成的。

在索引页面中,您需要在迭代它们时计算每个作业的平均评分。您可以像定义@average_rating一样执行此操作。如果您在show动作中将@average_rating定义为:

@average_rating = job.reviews.sum('score') / job.reviews.count

您需要在模型中定义此方法(更好的选项),例如:

应用程序/模型/ job.rb

def average_review
  reviews.sum('score') / reviews.count
end

然后在索引页面中:

<div class="average-review-rating" data-score=<%= job.average_review %>></div>

另一个选择是为索引页面本身的每个对象设置一个变量,减少工作但可能不那么整洁:

<% @jobs.each do |job| %>
  <%= link_to job.title, job_path(job) %></h4>
  <%= job.category %></p>
  <%= job.city %>
  <% average_review = job.reviews.sum('score') / job.reviews.count %>
  <div class="average-review-rating" data-score=<%= average_review %>></div>   
  <span class="number-of-reviews">Based on <%= job.reviews.count %>  reviews</span>               
      </div>
   </div>
 <% end %>

编辑:

在你的app / models / job.rb

def average_review
  reviews.blank? ? 0 : reviews.average(:rating).round(2)
end

和index.html.erb

<div class="average-review-rating" data-score=<%= job.average_review %>></div>

答案 1 :(得分:0)

您可以像这样获取这些结果:

def index
  @jobs = Job.all
  @average_reviews = Review.where(job_id: @jobs)
                           .group(:job_id)
                           .average(:rating)
                           .transform_values { |rating| rating.round(2) }
end

这将返回一个散列,其中作业ID为键,平均等级为值(舍入为2位小数)。要访问这些平均评级,您可以在索引视图中执行以下操作:

@jobs.each do |job|
  average_review = @average_reviews[job.id]
end

上面的代码只进行2次SQL调用,1次用于获取作业,1次用于获取所有已获取作业的所有平均评论。 请记住,如果某个工作没有评论。从哈希中获取平均评分时,将返回值nil