如果我有10个属性,如果条件正确我想要更新,我该怎么做?

时间:2012-11-23 02:17:25

标签: ruby-on-rails ruby-on-rails-3

假设我的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

对于剩下的属性等等,但这对我来说似乎非常不干净。

如何以优雅的方式执行此操作,而无需为所有属性键入10亿if statements

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

你可以使用这样的东西(不确定我是否理解你的对象是正确的)

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

答案 2 :(得分: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

我在这里假设您要迭代{em> Client模型的所有属性,但是从上面的注释线程看,情况并非如此。

答案 3 :(得分: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