【问题标题】:How to refactor repeating of similar getters and setters in rails model?如何重构 Rails 模型中类似的 getter 和 setter 的重复?
【发布时间】:2012-06-08 23:57:20
【问题描述】:

在我的 Rails 模型中,我有类似的东西

默认价格 Money.new(price_cents, 货币) 结束

def price=(val)
  price_cents = val.to_money.cents
end

def value
  Money.new(value_cents, currency)
end

def value=(val)
  value_cents = val.to_money.cents
end

def budget
  Money.new(budget_cents, currency)
end

def budget=(val)
  budget_cents = val.to_money.cents
end

def used
  Money.new(used_cents, currency)
end

def used=(val)
  used_cents = val.to_money.cents
end

这显然不是很干燥。我该如何重构它?

【问题讨论】:

标签: ruby-on-rails refactoring dry


【解决方案1】:

我假设 [thing]_cents 东西是指 ActiveRecord 模型的属性。如果是这样,我认为您可以按照这些方式做一些事情(很抱歉没有对此进行测试 - 希望它至少在方向上有帮助):

[:price, :value, :budget, :used].each do |prefix|

  self.class.send(:define_method, "#{prefix}=") do |val|
    write_attribute("#{prefix}_cents".to_sym, val.to_money.cents)
  end

  self.class.send(:define_method, "#{prefix}") do
    Money.new(read_attribute("#{prefix}_cents".to_sym), currency)
  end

end

【讨论】:

  • 这很棒!我把它放在一个单独的模块中。还将行 instance_eval "#{prefix}_cents_will_change!" 添加到 setter。
猜你喜欢
  • 2016-11-09
  • 2018-09-13
  • 2020-06-14
  • 1970-01-01
  • 2013-07-26
  • 2013-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多