1

我有一个我称之为的视图,school.html.erb在那个视图中我有 Ruby 代码来计算那所学校的平均评分。

像这样:

<span class="label label-info">
 <%= @school.reviews.average(:rating).round(1) unless @school.reviews.blank? %>
</span>

我喜欢把它移到其他地方,我应该把它放在模型、助手还是控制器中。如果我这样做,我怎么能从视图中调用它。

我有以下型号UserReviewSchool

4

4 回答 4

2

计算平均值属于模型:

class School < ActiveRecord::Base

  ...

  def average_review_rating
    return nil if reviews.blank?
    reviews.average(:rating)
  end

end

舍入平均值属于视图,因为它是格式化的。将计算放入模型中,并在视图(或助手)中进行格式化。

<%= @school.average_review_rating.round(1) if @school.average_review_rating %>

这可以使用andand gem 大大缩短。

<%= @school.average_review_rating.andand.round(1) %>

您可能希望将四舍五入推入帮助程序,在那里可以对其进行独立测试:

class SchoolHelper

  def format_rating(n)
    n.andand.round(1)
  end

end

像这样使用:

<%= format_rating(@school.average_review_rating) %>
于 2012-12-25T14:22:07.387 回答
0

我认为将它作为一种方法放入模型中是很有意义的。

class School
  def avg_rating
    reviews.average(:rating).round(1) unless reviews.blank?
  end
end

为什么有意义?好吧,学校评级是您可能必须在许多其他地方访问的东西:其他视图、其他模型等。通过将其放入方法中,您可能看起来只是School. school.avg_rating几乎是在自言自语:“学校,你的评价是多少?”

为什么视图不行?您可能希望在其他视图中访问它。有帮手,对吧?但是为什么助手不会做呢?您可能还想从其他模型访问它。助手不是用来计算数据的,它们是用来格式化数据和做其他类似的事情的。

于 2012-12-25T14:14:36.057 回答
0

放入模型(学校):

def reviews_average
  reviews.average(:rating).round(1) unless reviews.blank?
end

看法:

<%= @school.reviews_average %>

原因:不要将DB密集型程序放入视图中,因为渲染速度取决于它。

于 2012-12-25T14:18:02.983 回答
0

我会说它在模型中效果最好,因为它正在处理数据。这种遵循“胖模型,瘦控制器”的原则

另一个合理的选择是装饰者或演示者,使用像Draper这样的库。

于 2012-12-25T14:38:50.890 回答