我有一个观点,我称之为school.html.erb
,在该视图中我有Ruby代码来计算该学校的平均评分。
喜欢这样:
<span class="label label-info">
<%= @school.reviews.average(:rating).round(1) unless @school.reviews.blank? %>
</span>
我喜欢把它移到其他地方,我应该把它放在模型中,帮助者还是控制器中。如果我这样做,我怎么能从视图中调用它。
我有以下模型:User
,Review
和School
。
答案 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这样的库。