重构我的rails代码(模型方法)

时间:2014-08-03 23:50:40

标签: ruby-on-rails ruby

所以这很好用,我只需要进行一些重构。我想要实现的是,获取当前记录的所有值,或者只是放入另一列(计算列,就像在SQL中一样),它将保存以"地址&开头的所有字段的所有值。 #34;

到目前为止,这就是我所拥有的。

感谢您的任何意见。另外,如果可能的话,不要发布实际的重构代码,但只是让我知道我应该阅读什么或只是提示。我更喜欢自己实现这个目标。再次感谢。

  def address
    "#{self[:address_street1]} #{self[:address_street2]} #{self[:address_city]} #{self[:address_state]} #{self[:address_zipcode]} #{self[:address_country]}"
  end

1 个答案:

答案 0 :(得分:0)

您无需使用self[:foo]访问特定型号的foo字段。如果这是数据库中的列,则在类本身的代码中,您可以使用foo

def print_foo
  # not this
  # puts self[:foo]

  # use this instead
  puts foo
end

所以,要简化你的地址

def address
  [
    address_street1,
    address_street2,
    address_city,
    address_state,
    address_zipcode,
    address_country
  ].join(" ")
end

另一种方法是使用String#%

def address
  %Q{
    %s
    %s
    %s, %s %s
    %s
  } % [
    address_street1,
    address_street2,
    address_city,
    address_state,
    address_zipcode,
    address_country
  ]
end

这会产生类似

的输出
123 Main St
Apt 456
Seattle, WA 98122
USA

但是,如果一个或多个地址组件为空,则可能需要将其删除。要做到这一点,你可以做这样的事情

def address
  [
    address_street1,
    address_street2,
    address_city,
    address_state,
    address_zipcode,
    address_country
  ].reject(&:blank?).join(" ")
end

所有这些都说,我认为将地址分成他们自己的Address模型并完全分开表可能会更好。这将为您提供更多的灵活性来管理您的地址和处理其他一些复杂性。如果您愿意,Address模型可以处理所有格式,这意味着您不必使用所有这些地址逻辑来混淆您的(可推测的)User模型。

更不用说,各种型号可能都有地址;不只是用户。例如,订单具有开票/送货地址,信用卡具有开票地址,用户可以有多个地址,或者用户甚至可以拥有自己的联系人,而他们管理的地址不是他们自己的。如果每个需要地址的资源必须直接在其数据库表中包含address_*个字段,那么这将很快失去控制。