数组简单求和实现Rails

时间:2013-05-30 00:05:08

标签: ruby-on-rails view

我正在为数组上的简单实现而苦苦挣扎。我已经阅读了各种类方法但想确保我找到一个优雅的解决方案。

我基本上想知道给定系统中某些标签的原始数量。因此,如果代码belongs_to :person和某个人可以has_many :tags

我想知道如何渲染有多少人拥有“蓝色”标签的原始总数(如果有“蓝色”,“红色”,“绿色”和“橙色”标签)。这是我追求的路径,但我认为代码很快就会闻到......

<% @people.each do |person| %>
    <% if person.tags.include?('blue') %>
     <%= person.id %> # this is where I get stuck
    <% end %>
<% end %>

所以,我正在显示系统中所有具有蓝色标记的人的对象,但现在我需要将这些人的总和得到一个原始计数。我需要在视图中渲染几次,每种颜色一个(希望只在include中切换参数)。

这开始闻起来因为它不会变得非常干燥。这应该是一种类方法吗?我应该将返回的人员转换回数组并致电.count吗?

我最终可以获得原始数字,但我在这里有点失去了最佳实践。

--- --- UPDATE

这是我目前根据Gene的反馈更新的解决方案。

现在它更清洁,但现在我对性能感到疑惑,因为它似乎很慢。

我有一个辅助方法 -

def tag_count_for_person(tags_name)
    @people.count {|person| person.tags.include?('tags_name') }
end 

并为视图中需要呈现的任何标记调用此方法。

<div class="well span4">
<%= tag_count_for_person("green") %>
</div>
<div class="well span4">
<%= tag_count_for_person("blue") %>
</div>
<div class="well span4">
<%= tag_count_for_person("red") %>
</div>
<div class="well span4">
<%= tag_count_for_person("hungry") %>
</div>

我相信它仍然闻起来。每次我想在视图中呈现不同的标签时,我都不需要调用此方法吗?似乎代价高昂。但是,我没有添加我想要呈现正确的不同标签的灵活性?我觉得我离我更近了。

2 个答案:

答案 0 :(得分:1)

  

但我认为代码很快就会闻到......

嗯,它确实已经闻到了。这种逻辑不属于视图。你最好将它放入控制器或模型中。这是一个例子。

colors = ['blue', 'red', 'green']

@people = ...

@people_count = {} # here we'll store counts by color
@people.each do |person|
  colors.each do |col|
    if person.tags.include?(col)
      # increment count
      @people_count[col] ||= 0
      @people_count[col] += 1
    end
  end
end

另一种方法,更优雅

colors = ['blue', 'red', 'green']
@people_count = colors.each_with_object({}) do |color, memo|
  memo[color] = @people.count{|p| p.tags.include?(color)}
end

然后,在视图中

<%= @people_count['blue'] %>

答案 1 :(得分:0)

嗯,我同意@Sergio Tulenntsev,但如果你只需要计算蓝色,那么你可以用一种不会闻到太多气味的方式:

<%= @people.count {|person| person.tags.include?('blue') } %>

将生成具有蓝色标记的整数个人。将它放在辅助函数中会更简洁。