所以我试图通过平均评分来订购我的提供商(类似于用户)指数,最高点位于顶部。它可以工作,但为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异常错误。
任何帮助都将非常感谢!!!很高兴在需要时提供更多信息。
答案 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关系访问评论。