Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails4重构模型使之干燥_Ruby On Rails_Ruby On Rails 4 - Fatal编程技术网

Ruby on rails Rails4重构模型使之干燥

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

我尝试优化以下会计模型课程,有两个问题:

1) 如何用更优雅的方法替换多属性设置器

2) 在“用点替换逗号”方法中是否有比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

我缺少什么?

您可以使用
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,我重视您的见解和反馈!