0

Clientモデルに次のような一連の属性があるとします。

#  firm_size                 :float
#  priority_level            :float
#  inflection_point          :float
#  personal_priority         :float
#  sales_priority            :float
#  sales_team_priority       :float
#  days_since_contact        :float
#  does_client_vote          :float
#  did_client_vote_for_us    :float
#  days_until_next_vote      :float
#  does_client_vote_ii       :float
#  did_client_vote_ii_for_us :float
#  days_until_vote_ii        :float

そして、次のように各属性のチェックを実行する必要があります。

max = Max.find_or_create_by_user_id(:user_id => current_user.id)

if client.firm.size > max.firm_size
    max.firm_size = client.firm.size
end

if client.inflection_point > max.inflection_point
    max.inflection_point = client.inflection_point
end

残りの属性についても同様ですが、これは私には非常に乾燥していないようです.

if statementsすべての属性に対して10 億を入力することなく、これをエレガントな方法で行うにはどうすればよいでしょうか?

4

4 に答える 4

1

すべての属性を配列に配置する場合は、それを繰り返し処理し、メタプログラミングを使用して、ロジックを1回だけ記述する必要があります。

good_attrs = %w(firm_size priority_level ...)

good_attrs.each do |attr|
  if client.send(attr) > max.send(attr)
    max.send("#{attr}=", client.send(attr)
  end
end
于 2012-11-23T02:30:32.657 に答える
1

あなたはこのようなものを使うことができます(私があなたのオブジェクトを正しく理解しているかどうかはわかりません)

[ :firm_size, :priority_level, :inflection_point, ... ].each do |attr|
  if client[attr] > max[attr]
    max[attr] = client[attr]
  end
end

ほぼ同じ...

于 2012-11-23T02:30:56.527 に答える
1

これはどう:

Client.column_names.each do |attr_name|
  if (client_val = client.send(attr_name)) > max.send(attr_name)
    max.write_attribute(attr_name, client_val) 
  end
end

ここでは、モデルのすべての属性を反復処理することを想定していますClientが、上記のコメントスレッドからは、そうではないようです。

于 2012-11-23T02:31:01.750 に答える
1

まず、client.rbこのタイプの比較に利用する属性のモデルにホワイトリストメソッドを作成します。

def self.comparable_attrs
  %w(firm_size priority_level inflection_point personal_priority ...)
end

次に、メソッドを使用してすべてのgood_attrsをループできますsend()

Client.comparable_attrs.each do |attr|
  if client.send(attr) > max.send(attr)
    max.send("#{attr}=", client.send(attr))
  end
end
于 2012-11-23T02:32:59.613 に答える