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