Ruby on rails Rails循环重构

Ruby on rails Rails循环重构,ruby-on-rails,ruby-on-rails-3,Ruby On Rails,Ruby On Rails 3,我创建了一个循环,用于计算记录的总评分。为此,我首先循环遍历所有子记录的评分,从每行中提取评分,将其添加到总数中,然后输出总数 <% total = 0 %> <% for ratings in @post.ratings %> <% total = (total + ratings.rating) %> <% end %> <%= total %> 我的问题很简单,这是rails的方式吗 虽然需要5行代码,但它还是达到了预期

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

<% total = 0 %>
<% for ratings in @post.ratings %>
    <% total = (total + ratings.rating) %>
<% end %>
<%= total %>
我的问题很简单,这是rails的方式吗


虽然需要5行代码,但它还是达到了预期的效果。我担心我会把其他语言的旧习惯带到我的rails项目中,我希望有人能澄清是否有更简单的方法。

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

您通常应该将逻辑排除在视图之外。我会把代码放在助手或控制器中,调用一个方法来计算总数,然后将以下内容放在控制器中,然后您只需要在视图中使用@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

将以下内容放入控制器,然后您只需在视图中使用@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

以下命令,最好是在控制器中,即可简洁地执行此操作:

@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) }

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

@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) }

您可以显式地将评级转换为| i以避免| |运算符。但无论如何,第一个示例是您应该接受的唯一示例,它将db查询的数量减少到1,并提高了性能。您可以显式地将评级转换为_i,以避免使用| |运算符。但无论如何,第一个示例是您应该接受的唯一示例,它将db查询的数量减少到1,并提高了性能。