如何设置string类型的activerecord字段的默认格式?

时间:2009-11-20 20:10:52

标签: ruby-on-rails ruby activerecord

这是一个简单的问题:

如何在ActiveRecord中设置字符串字段的默认格式?

我尝试了以下内容:

def phone_number_f
  "...#{phone_number}format_here..."
end

但我想保持方法名称与字段名称相同。

2 个答案:

答案 0 :(得分:3)

不确定你到底在找什么,但我猜这就是这个。

def phone_number
  "...#{read_attribute(:phone_number)}format_here..."
end

答案 1 :(得分:1)

您是希望以特定格式存储内容还是以特定格式输出它们。

除非您必须对事物进行计算,否则在将数据存储到数据库之前将数据放入正确的格式更有意义。这样你只需要转换一次。

最好的方法是使用before_validate回调将事物放入正确的格式(如果还没有)。与validates_format_of helper一起使用它以确保它有效。您可能已经将无法按摩的数据传递到您想要的格式。

如果确实需要执行计算并且可能需要更改输出格式,则可以使用格式化程序回调方法作为格式化字符串。您可能需要查看String#subString#unpackKernel#sprintf / String#%

北美电话号码示例: 正则表达式可能是错误的,但这不是示例的重要部分。

before_validate :fix_phone_number_format

def fix_phone_number_format
  self.phone_number = "(%s) %s-%s" % phone_number.gsub(/[\D]/, "").unpack("A3A3A4")
end

validates_format_of :phone_number, :with => /^(\d{3}) \d{3}-\d{4}/

编辑:转换稍微复杂一点,所以这里是一步一步细分,就像ruby做的事情一样。电话号码为123-555-1234。

"(%s) %s-%s" % phone_number.gsub(/[\D]/, "").unpack("A3A3A4")
"(%s) %s-%s" % "123-555-1234".gsub(/[\D]/, "").unpack("A3A3A4")

# remove all non digits from the string
"(%s) %s-%s" % "1235551234".unpack("A3A3A4")

# break the string up into an array of three pieces.
# Such that the first element is the first 3 characters in the string,
# the second element is 4th through 6th characters in the string,
# and the third element is the remaining digits.
"(%s) %s-%s" % ["123","555","1234"]

# Apply the format string to the array.
"(123) 555-1234"