我似乎找不到任何方法可以成功地将十进制字段设置为表单中没有值,因为表单返回一个空字符串。这是一个超级简单的测试用例,可以手动将字段设置为''
require 'dm-core'
require 'dm-mysql-adapter'
require 'dm-migrations'
DataMapper.setup(:default, 'mysql://localhost/test')
class Product
include DataMapper::Resource
property :id, Serial
property :list_price, Decimal
end
DataMapper.finalize
DataMapper.auto_migrate!
p = Product.new
puts p.save #=> true
p = Product.new(:list_price => '')
puts p.save #=> false
p = Product.new(:list_price => nil)
puts p.save #=> true
正如您所看到的,list_price
字段在未设置或将其设置为nil时将很乐意保存。但是,当我使用空白字符串时,它根本不会保存 - 它似乎没有被强制转换。
似乎我必须在这里遗漏一些明显的东西,因为这是ORM的一个非常基本的用例。
答案 0 :(得分:2)
您可以为属性创建自己的setter方法以检查其类型。请参阅Datamapper properties documentation page上的“覆盖访问者”部分。
添加:
def list_price=(new_price)
new_price = nil if new_price == ''
super
end
到你的Product
类将导致任何空字符串被设置为list_price
的值被转换为nil,并允许保存资源。