【发布时间】:2016-02-20 03:59:00
【问题描述】:
我尝试优化以下会计模型类,有两个问题:
1) 如何用更优雅的方法替换多个属性设置器?
2)是否有比replace_comma_with_dot方法中的if条件更好的方法
class Accounting < ActiveRecord::Base
validates :share_ksk, :central_office, :limit_value, :fix_disagio,
presence: true, numericality: { less_than: 999.99, greater_than_or_equal_to: 0.00 },
format: { with: /\d*\.\d{0,2}$/, multiline: true, message: I18n.t('accounting.two_digits_after_decimal_point')}
def share_ksk=(number)
replace_comma_with_dot(number)
super
end
def central_office=(number)
replace_comma_with_dot(number)
super
end
def limit_value=(number)
replace_comma_with_dot(number)
super
end
def fix_disagio=(number)
replace_comma_with_dot(number)
super
end
def replace_comma_with_dot(number)
if number.is_a? String
number.sub!(",", ".")
elsif number.is_a? Float
number
else
""
end
end
end
正如用户 Pardeep 建议的那样,我正在尝试用 define_method 替换我的吸气剂:
[:share_ksk=, :central_office=, :limit_value=, :fix_disagio=].each do |method_name|
self.class.send :define_method, method_name do |number|
replace_comma_with_dot(number)
super
end
end
我错过了什么?
【问题讨论】:
-
更新是非常不好的做法
-
我应该坚持四传手吗?
-
也许,我已经写了一半的答案——看看有没有更好的方法
-
您的更新所做的就是所谓的元编程。虽然这在某些情况下是可以的 - 它必须受到限制,否则可能会在更大的应用程序中导致冲突和问题
标签: ruby-on-rails ruby-on-rails-4