Ruby on rails NoMethodError在Rails 4中使用两个型号

Ruby on rails NoMethodError在Rails 4中使用两个型号,ruby-on-rails,activerecord,model-view-controller,nomethoderror,Ruby On Rails,Activerecord,Model View Controller,Nomethoderror,我有房地产经纪人的评级系统。我有一个代理模型和一个代理审查模型。评级存储在agent_review表中,但我需要在agent模型下的视图中显示平均评级,我遇到了一些问题。所有代码都张贴在下面,请提前感谢您 代理模型: has_many :agent_reviews 代理审查模式: belongs_to :agent 代理视图: <h3>Agent Rating: <%= @agent.agent_reviews.rating %> (<%= @agent.age

我有房地产经纪人的评级系统。我有一个代理模型和一个代理审查模型。评级存储在agent_review表中,但我需要在agent模型下的视图中显示平均评级,我遇到了一些问题。所有代码都张贴在下面,请提前感谢您

代理模型:

has_many :agent_reviews
代理审查模式:

belongs_to :agent
代理视图:

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


@agent.agent\u reviews
是一种活动记录关系-没有“评级”,因为它不止一个
agent\u 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>
代理评级:()

@agent.agent\u reviews
是一种活动记录关系-没有“评级”,因为它不止一个
agent\u 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>
代理评级:()

添加到Jhon Feltz答案中,您可以在短模式下完成此操作。像这样:

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

除了Jhon Feltz的答案之外,您还可以在短时间内完成此操作。像这样:

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

显示终端的完整错误日志显示终端的完整错误日志