4

このコードを完全に動的になるように書き直すにはどうすればよいですか。また、このcase句を使用して、可能なすべての値を手動で一覧表示する必要はありませ@groupん。

# Grouping
@group = params[:group] if !params[:group].blank?
case @group
  when 'category_id'
    @ideas_grouped = @ideas.group_by { |i| i.category_id }
  when 'status_id'
    @ideas_grouped = @ideas.group_by { |i| i.status_id }
  when 'personal_bias'
    @ideas_grouped = @ideas.group_by { |i| i.personal_bias }
  when 'business_value'
    @ideas_grouped = @ideas.group_by { |i| i.business_value }
end
4

5 に答える 5

4

ある種のメタプログラミングを使用できます。上記のコードは、次のいずれかの方法でリファクタリングできます。

if params[:group].present? && ["category_id","status_id","personal_bias","business_value"].include?(params[:group])
    @ideas_grouped = @ideas.group_by { |i| i.send(params[:group]) }
end
于 2012-11-02T09:19:19.617 に答える
2

これを試してください:

@ideas_grouped = @ideas.group_by { |i| i.send(:"#{@group}")} if (@group = params[:group])
于 2012-11-02T09:24:53.407 に答える
2

ホワイトリストが不要な場合:

@ideas_grouped = if (group = params[:group]).present?
  @ideas.group_by(&group.to_sym)
end

ホワイトリストが必要な場合は、include?最初に呼び出すことができますが (Amar の回答を参照)、何か新しいものを追加するには、宣言型のアプローチでプッシュさせてください (Object#whitelist読者の演習として残されています。 Ickmaybeから来ています):

@ideas_grouped = params[:group].whitelist(IdeaGroupers).maybe do |group|
  @ideas.group_by(&group.to_sym)
end
于 2012-11-02T09:54:28.823 に答える
1

どうですか :

@group = params[:group] if !params[:group].blank?
@ideas_grouped = ideas_hash.fetch(@group)

def ideas_hash
  {
    'category_id'     => ideas_by_category_id,
    'status_id'       => ideas_by_status_id,
    'personal_bias'   => ideas_by_personal_bias
    'business_value'  => ideas_by_business_value
  }
end

def ideas_by_category_id
  @ideas.group_by { |i| i.category_id }
end

def ideas_by_status_id
  @ideas.group_by { |i| i.status_id }
end

def ideas_by_personal_bias
  @ideas.group_by { |i| i.personal_bias }
end

def ideas_by_business_value
  @ideas.group_by { |i| i.business_value }
end

また、ideas_hash と他のすべてのメソッドを非公開にします。

于 2014-11-07T23:39:27.160 に答える
0

最後に Ruby に触れたのはかなり前のことなので、例を挙げることはできません。私があなたの問題を理解している限り、そこでマッピング(グループ->アクセサメソッド)を行っています。したがって、マップ オブジェクトを使用するか、ラムダを使用してマッピング関数を作成します。

于 2012-11-02T09:55:41.560 に答える