尝试根据平均评分

时间:2015-04-29 21:17:10

标签: sql ruby-on-rails ruby-on-rails-4

我正在尝试根据评级的平均值来订购索引。评级是评论模型的整数属性。 以下是我的相关模型:

provider.rb

class Provider < ActiveRecord::Base
  belongs_to :user, foreign_key: 'user_id', autosave: true
  has_many :reviews, :through => :user, dependent: :destroy

  def reviews
    Review.where("provider_id = ?", id)
  end
end

review.rb

class Review < ActiveRecord::Base
  belongs_to :user, foreign_key: 'user_id'
  belongs_to :provider, foreign_key: 'provider_id'
end

在我的视图中尝试访问提供程序属性时出现错误,如下所示:

index.html.erb

<% @providers.each do |provider| %>
  <tr>
    <td><%= link_to provider.name, provider_path(provider.id) %></td>
    <td><%= provider.industry %></td>
    <td><%= provider.tag %></td>
    <td><%= provider.description %></td>
    <td><%= provider.reviews.average(:rating) %></td>
  </tr>
<% end %>

导致此问题的代码(我认为)在我的产品控制器中:

providers_controller.rb

class ProvidersController < ApplicationController
  before_action :set_provider, only: [:show, :edit, :update, :destroy]

  def index
    @providers = Provider.select("avg(reviews.rating) as avg_rating").joins(:reviews).order("avg_rating DESC")
    @reviews = Review.find_by(params[:provider_id])
  end

我无法访问视图中列出的任何属性。我不确定问题是在我的视图代码还是我的控制器代码中。谢谢你的帮助。

错误

activerecord (4.2.1) lib/active_record/attribute_methods/read.rb:93:in `block in _read_attribute'
activerecord (4.2.1) lib/active_record/attribute_set.rb:31:in `block in fetch_value'
activerecord (4.2.1) lib/active_record/attribute.rb:150:in `value'
activerecord (4.2.1) lib/active_record/attribute_set.rb:31:in `fetch_value'

错误修改

显示/home/Danae/RubymineProjects/canvas/app/views/providers/index.html.erb第20行:

缺少属性:名称

菜鸟错误的我。有一个干扰avg_rating的列名。 cschroed的答案是完美的。

1 个答案:

答案 0 :(得分:1)

使用add(i, node)时,未选择任何其他提供程序列。如果您要选择其他列,可以使用pos,然后由于select("avg(reviews.rating) as avg_rating")是一个聚合函数,您还必须使用select("providers.*, avg(reviews.rating) as avg_rating")。尝试:

avg

别名group("providers.id")应该是唯一的名称,与您表格中的任何列名称都不匹配。