0

У меня есть система оценки для агентов по недвижимости. У меня есть модель агента и модель agent_review. Рейтинг хранится в таблице agent_review, но мне нужно отобразить среднюю оценку в представлении под моделью агента, и я столкнулся с какой-то проблемой. Весь код размещен ниже, пожалуйста и заблаговременно.NoMethodError, работающий с двумя моделями в Rails 4

модель агент:

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 является активным отношением записи - нет «рейтинга» для этого, так как это больше, чем один 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

Добавление к Jhon Feltz ответ, вы можете сделать это в коротком режиме. Например:

def average_rating 
    agent_reviews = self.agent_reviews 
    agent_reviews.any? ? (agent_reviews.map(&:rating).sum/agent_reviews.count) : nil 
end 
Смежные вопросы