我应该把它放在模型中,帮助器还是控制器?

时间:2012-12-25 14:07:47

标签: ruby-on-rails model-view-controller

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

喜欢这样:

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

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

我有以下模型:UserReviewSchool

4 个答案:

答案 0 :(得分: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) %>

答案 1 :(得分:1)

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

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

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

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

答案 2 :(得分:0)

加入模特(学校):

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

查看:

<%= @school.reviews_average %>

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

答案 3 :(得分:0)

我认为它在模型中效果最好,因为它使用的是数据。这种关注the "fat model, skinny controller" principle

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