我正在为数组上的简单实现而苦苦挣扎。我已经阅读了各种类方法,但想确保我找到了一个优雅的解决方案。
我基本上想知道给定系统中有多少特定标签的原始计数。所以如果一个标签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
吗?
我最终可以得到原始数字,但我对这里的最佳实践有点迷失了。
- -更新 - -
这是我迄今为止根据 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>
我相信它仍然闻起来。每次我想在视图中呈现不同的标签时,我不需要调用这个方法吗?看来代价不菲。但是我没有添加我想要正确渲染的不同标签的灵活性?我觉得我离得更近了。