0

Ich habe ein Rating-System für Immobilienmakler. Ich habe ein Agentenmodell und ein agent_review-Modell. Die Bewertung wird in der agent_review-Tabelle gespeichert, aber ich muss die Durchschnittsbewertung in einer Ansicht unter dem Agentenmodell anzeigen und stoße auf ein Problem. Der gesamte Code ist unten veröffentlicht, bitte und danke im Voraus.NoMethodError arbeiten mit zwei Modellen in Rails 4

Mittel Modell:

has_many :agent_reviews 

agent_review Modell:

belongs_to :agent 

Mittel Ansicht:

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

Agent Controller anzeigen Methode:

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 

Fehler:

enter image description here

+0

Zeigen Sie das vollständige Fehlerprotokoll von Ihrem Terminal – luissimo

Antwort

1

@agent.agent_reviews ist ein Active Beziehung Record - es gibt keine für die Bewertung der Nutzer ", da es mehr als ein agent_review Objekt ist (die Tatsache, dass es Ihnen sagen, dass Plural ist sollte).

Wenn also ein Agent 6 Bewertungen hat, deren Bewertungen von 1 bis 5 variieren, möchten Sie den Durchschnitt dieser Werte anzeigen. Sie müssen die folgenden auf die agent.rb Modelldatei hinzuzufügen:

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 

(das ist ausführlicher als es sein muss, können Sie es mit einigen SQL Magie kondensieren könnte)

Und Hinweis, dass neue Verfahren in Ihre Ansicht:

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

Das hat perfekt funktioniert. Vielen Dank! –

2

Hinzufügen zu Jhon Feltz Antwort, können Sie dies in einem kurzen Modus tun. Wie folgt:

def average_rating 
    agent_reviews = self.agent_reviews 
    agent_reviews.any? ? (agent_reviews.map(&:rating).sum/agent_reviews.count) : nil 
end 
Verwandte Themen