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

如果将所有属性放在一个数组中,则可以对其进行迭代并使用一些元编程,只需编写一次逻辑:

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

send()然后,您可以使用该方法遍历所有 good_attrs 。

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 回答