我试图在我的索引页面上显示作业的平均评分,它在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>
答案 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
。