0

私は不動産業者の評価システムを持っています。私はエージェントモデルとagent_reviewモデルを持っています。レーティングはagent_reviewテーブルに格納されますが、平均レーティングをエージェントモデルのビューに表示する必要があり、問題が発生しています。すべてのコードは以下に掲載されています。予めご了承ください。NoMethodErrorはRails 4の2つのモデルで動作します

エージェントモデル:

has_many :agent_reviews 

agent_reviewモデル:

belongs_to :agent 

エージェントビュー:

<h3>Agent Rating: <%= @agent.agent_reviews.rating %> (<%= @agent.agent_reviews.count %>)</h3> 

エージェントコントローラショー方法:

def show 
    @agent_reviews = AgentReview.all 
    @agent = Agent.find_by_slug(params[:id]) || Agent.find(params[:id]) 

    if @agent.private_profile? && !current_agent&.super_admin? 
     redirect_to root_path, notice: "That user has a private profile" 
    else 
     @favorite_listings = @agent.liked_listings.available.includes(:neighborhood) 
     @agent_listings = @agent.sales_agent_listings.available.visible 
     @mate_posts = @agent.liked_mates.order(:when) 

     respond_to do |format| 
     format.html 
     format.json { render json: @agent } 
     end 
    end 
    end 

エラー:

enter image description here

+0

端末から完全なエラーログを表示する – luissimo

答えて

1

@agent.agent_reviewsは、Active Recordの関係である - それは、複数のagent_reviewオブジェクト(それは複数のことを教えなければならないという事実)ですので、そのための「評価」は、ありません。

エージェントに6件の評価があり、1から5までの格付けがある場合、それらの平均を示したいとします。あなたはagent.rbモデルファイルに以下を追加する必要があります。

def average_rating 
    if self.agent_reviews.any? 
    sum = 0 
    self.agent_reviews.each do |agent_review| 
     sum += agent_review.rating 
    end 
    return sum/self.agent_reviews.count 
    else 
    return nil # agent has no reviews, don't divide by zero! 
    end 
end 

(それはそれがために必要以上に冗長だ、あなたには、いくつかのSQLの魔法でそれを凝縮できる)

およびリファレンスの新しい方法そのあなたのビュー:

<h3>Agent Rating: <%= @agent.average_rating %> (<%= @agent.agent_reviews.count %>)</h3> 
+0

これは完全に機能しました。ありがとうございました! –

2

これをショートモードで追加することができます。このように:

def average_rating 
    agent_reviews = self.agent_reviews 
    agent_reviews.any? ? (agent_reviews.map(&:rating).sum/agent_reviews.count) : nil 
end 
関連する問題