Rails循环重构

时间:2013-02-17 06:28:15

标签: ruby-on-rails ruby-on-rails-3

我创建了一个循环来计算记录的总评分。为此,我首先循环遍历所有子记录(评级),从每行中提取评级,将其添加到总计中,然后输出总计。

<% total = 0 %>
<% for ratings in @post.ratings %>
    <% total = (total + ratings.rating) %>
<% end %>
<%= total %>

我的问题是,这是铁路吗?

虽然需要5行才能达到预期的效果。我担心我将其他语言的旧习惯带入我的rails项目中,我希望有人可以澄清是否有更简单的方法。

3 个答案:

答案 0 :(得分:3)

以下内容,最好是在控制器中,将简洁地完成:

@rating = @post.ratings.sum { &:rating }

如果这看起来很神秘,你可能更喜欢

@rating = @post.ratings.inject(0) { |sum, p| sum + p.rating }

但请注意,如果任何评级为空,则会失败,因此您可能需要:

@rating = @post.ratings.inject(0) { |sum, p| sum + (p.rating || 0) }

答案 1 :(得分:1)

您通常应该将逻辑排除在观点之外。我会将该代码放在帮助器或控制器中,并调用一个方法来计算总数

答案 2 :(得分:0)

将以下内容放入您的控制器中,然后您只需在视图中使用@rating

total = 0
@rating = @post.ratings.each { |r| total += r.rating }

或者您可以将其移动到Post模型中并执行以下操作:

def self.total_rating
  total = 0
  ratings.each { |r| total += r.rating }
  total
end

然后只需致电@post.total_rating