Ruby on rails Rails4重构模型使之干燥
我尝试优化以下会计模型课程,有两个问题: 1) 如何用更优雅的方法替换多属性设置器 2) 在“用点替换逗号”方法中是否有比if条件更好的方法Ruby on rails Rails4重构模型使之干燥,ruby-on-rails,ruby-on-rails-4,Ruby On Rails,Ruby On Rails 4,我尝试优化以下会计模型课程,有两个问题: 1) 如何用更优雅的方法替换多属性设置器 2) 在“用点替换逗号”方法中是否有比if条件更好的方法 class Accounting < ActiveRecord::Base validates :share_ksk, :central_office, :limit_value, :fix_disagio, presence: true, numericality: { less_than: 999.99, great
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
我缺少什么?您可以使用
define\u方法动态定义方法,您可以查看更多信息
你可以用这个更新你的用点替换逗号
def replace_comma_with_dot(number)
return number.sub!(",", ".") if number.is_a? String
return number if number.is_a? Float
""
end
结束您可以使用define\u方法
动态定义方法,您可以定义更多信息
你可以用这个更新你的用点替换逗号
def replace_comma_with_dot(number)
return number.sub!(",", ".") if number.is_a? String
return number if number.is_a? Float
""
end
end我将提取功能并将其附加到或类中,而不是在模型中使用方法:
这-如果您的编号
是字符串
将允许您执行以下操作:
number = "67,90"
number.replace_comma_with_dot
要在应用程序中使用此功能,setters是可以的。您可以实现以下功能:
def fix_disagio=(number)
self[:fix_disagio] = number.replace_comma_with_dot
end
你的更新是可以的,除了我自己会避开它,因为它会造成不需要的膨胀
我一直在寻找一种在从db中提取时设置属性的方法,但后来我意识到,如果每次调用模型时都必须设置属性,那么肯定会出现问题
我个人会考虑在db
级别更改此设置,否则,您可能可以使用某种本地化
来确定是否需要点
或逗号
这里有一个很好的答案,它提倡:
class ActiveRecord::Base
def self.attr_本地化(*字段)
字段。每个do |字段|
定义_方法(“#{field}=”)do|值|
self[field]=值。_是?(字符串)吗?value.to\u非定域\u十进制:值
结束
结束
结束
结束
类记帐
我将提取功能并将其附加到或类中,而不是在模型中使用方法:
这-如果您的编号
是字符串
将允许您执行以下操作:
number = "67,90"
number.replace_comma_with_dot
要在应用程序中使用此功能,setters是可以的。您可以实现以下功能:
def fix_disagio=(number)
self[:fix_disagio] = number.replace_comma_with_dot
end
你的更新是可以的,除了我自己会避开它,因为它会造成不需要的膨胀
我一直在寻找一种在从db中提取时设置属性的方法,但后来我意识到,如果每次调用模型时都必须设置属性,那么肯定会出现问题
我个人会考虑在db
级别更改此设置,否则,您可能可以使用某种本地化
来确定是否需要点
或逗号
这里有一个很好的答案,它提倡:
class ActiveRecord::Base
def self.attr_本地化(*字段)
字段。每个do |字段|
定义_方法(“#{field}=”)do|值|
self[field]=值。_是?(字符串)吗?value.to\u非定域\u十进制:值
结束
结束
结束
结束
类记帐
谢谢你,伙计!我在用define_方法替换setter时遇到了一些麻烦。你能详细解释一下吗?谢谢你,伙计!我在用define_方法替换setter时遇到了一些麻烦。你能详细说明一下吗?更新是非常糟糕的做法,那么我应该坚持四个setter吗?也许,我已经写了半个答案-看看是否有更好的方法你的更新做的是所谓的元编程。虽然这在某些情况下是可以的-它必须受到限制,否则它可能会在更大的应用程序中引起冲突和问题。更新是非常糟糕的做法。那么我应该坚持四个设置器吗?也许,我已经写了半个答案-看看是否有更好的方法你的更新做的是所谓的元编程。虽然这在某些情况下是可以的,但必须加以限制,否则可能会在更大的应用程序中引起冲突和问题谢谢@richpeck,我很重视您的见解和反馈!谢谢@richpeck,我重视您的见解和反馈!