将两个常数合二为一

时间:2014-10-14 10:44:01

标签: ruby-on-rails ruby constants dry

有没有办法让这两个常数变干?只有措辞和船只不同,是否可以用参数改变它,所以最后,我只有一个常数?

BILLING_ADDRESS_MAPPING = {
  first_name:   :bill_first_name_c,
  last_name:    :bill_last_name_c
}

SHIPPING_ADDRESS_MAPPING = {
  first_name:   :ship_first_name_c,
  last_name:    :ship_last_name_c
}

稍后将使用它们中的每一个:

  ship_address = Address.new

  SHIPPING_ADDRESS_MAPPING.each do |rails_attr, sugar_attr|
    ship_address.send(:"#{ rails_attr }=", sugar_opportunity.send(sugar_attr))
  end

  ship_address.save

1 个答案:

答案 0 :(得分:1)

ruby​​中的常量不允许动态更改更改。但是如果你将address_mapping保持为常数,那么肯定有一个解决方法:

def address_mapping(type)
address_mapping = {
  first_name:   "#{type}_first_name_c".to_sym,
  last_name:    "#{type}_last_name_c".to_sym
}
return address_mapping
end

这是您的方法,您可以将“结算”或“发货”作为字符串传递,结果应该是您想要的。

现在你应该使用它:

ship_address = Address.new
address_mapping("shipping").each do |rails_attr, sugar_attr|
  ship_address.send(:"#{ rails_attr }=", sugar_opportunity.send(sugar_attr))
end
ship_address.save

如果我理解错了,请告诉我。希望它有所帮助:)