我正在尝试根据评级的平均值来订购索引。评级是评论模型的整数属性。 以下是我的相关模型:
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的答案是完美的。
答案 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")
应该是唯一的名称,与您表格中的任何列名称都不匹配。