0

配列での単純な実装に苦労しています。さまざまなクラス メソッドを読みましたが、エレガントなソリューションにたどり着くようにしたいと考えています。

基本的に、特定のシステムにある特定のタグの数の生の数を知りたいです。だからタグ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 %>

そのため、システム内で青いタグが付いているすべての人物のオブジェクトを表示していますが、生のカウントを取得するには、これらの人物を合計する必要があります。そして、これをビューで数回、各色に 1 回レンダリングする必要があります ( 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>

それはまだ私が信じているにおいがします。ビューで別のタグをレンダリングするたびに、このメソッドを呼び出す必要はありませんか? 費用がかかるようです。しかし、それでは、正しくレンダリングしたいさまざまなタグを追加する柔軟性がありませんか? もっと近くにいるような気がします。

4

2 に答える 2

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'] %>
于 2013-05-30T00:10:10.460 に答える
0

まあ、私は@Sergio Tulenntsevに同意しますが、青だけを数える必要がある場合は、あまり臭いがしない方法で数えることができます:

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

タグ blue を持つ整数の人数を生成します。これをヘルパー関数に入れると、少しきれいになります。

于 2013-05-30T00:20:47.333 に答える