Ruby on Rails:根据平均评论评级发布排序索引

时间:2015-04-27 19:27:06

标签: ruby-on-rails sqlite postgresql ruby-on-rails-4

所以我试图通过平均评分来订购我的提供商(类似于用户)指数,最高点位于顶部。它可以工作,但为Provider提供的每个Review都添加了一行。例如。如果我有一个提供商有3个评论,提供商将在提供商索引中显示3次。评级是评论栏,是1-5之间的整数。

provider.rb

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

review.rb

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

providers_controller.rb

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

 def index
   @providers = Provider.all
                 .joins(:reviews)
                 .order("reviews.rating DESC")
   @reviews = Review.find_by(params[: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.experience %></td>
    <td><%= provider.description %></td>
    <td><%= provider.reviews.average(:rating) %></td>
  </tr>
<% end %>

它可能是非常愚蠢的,因为我对Ruby + Rails很陌生,但我似乎无法弄明白/找到相关信息。我已经尝试添加&#34; AVG(reviews.rating)DESC&#34;到订单方法,但这给了我一个SQLite异常错误。

任何帮助都将非常感谢!!!很高兴在需要时提供更多信息。

2 个答案:

答案 0 :(得分:2)

它给你一个sql错误,因为你的错误与rails无关。

在SQL中,如果您使用的是聚合函数,例如avg(),那么该列必须出现在您的select子句中。

 string Text = txtname.Text;
        string sql = "insert into m_Language(fullname) values(@HindiText)";
        cmd = new SqlCommand(sql, con);
        cmd.Parameters.Add("@HindiText", SqlDbType.NVarChar, 50).Value = val;
        int res;
        res = cmd.ExecuteNonQuery();
        res = 1;
        con.Close();

由于以下评论而编辑

答案 1 :(得分:1)

我假设您要求同一个提供商的多个结果,所以我将尝试解决这个问题。当您加入提供者和评论表时,您将获得为该提供者提供评论时为每个提供者返回的行数。这是因为如果我们有一个提供者: {:id =&gt; 1,:reviews =&gt; [...]} 并加入以下评论: [{:id =&gt; 1,:provider_id =&gt; 1,:content =&gt; “blah”},{:id =&gt; 2,:provider_id =&gt; 1,:content =&gt; “bar”},{:id =&gt; 3,:provider_id =&gt; 1,:content =&gt; “foo” 的}]

SQL将返回一个类似于:

的表
provider_id, review_id, content
1             1           blah
1             2           bar
1             3           foo

在您的情况下,我认为一个合适的解决方案就是完全消除连接子句。这样做可以消除重复,您仍然可以通过提供者has_many关系访问评论。