我认为你做得对。此测试通过:
test "should remove commas from thenumber" do
f = Foo.new(:thenumber => "10,000")
f.save
f = Foo.find(f.id)
assert f.thenumber == "10000"
end
我使用了你的代码。
class Foo < ActiveRecord::Base
before_validation :normalize
def normalize
self['thenumber'] = self['thenumber'].to_s.gsub(',','')
end
end
现在,我的架构设置为数字是字符串,而不是整数。
Started
.
Finished in 0.049666 seconds.
1 tests, 1 assertions, 0 failures, 0 errors
如果你想将它作为整数存储在数据库中,那么你肯定需要覆盖 setter:
def thenumber=(value)
self['thenumber'] = value.to_s.gsub(',','').to_i
end
如果你按照自己的方式使用整数列,它会被 AR 截断......
>> f.thenumber = "10,000"
=> "10,000"
>> f.thenumber
=> 10
对于 Ruby 和整数来说,这是一个鲜为人知的事情......它通过截断不再是整数的任何内容来自动转换。
irb(main):004:0> i = "155-brian-hogan".to_i
=> 155
对于诸如此类的事情可能很酷
/users/155-brian-hogan
@user = User.find_by_id(params[:id])
但对于你正在做的事情来说并不那么酷。
所以要么将 col 更改为字符串并使用过滤器,要么更改 setter :)
祝你好运!