无法将数字DataMapper字段设置为空值

时间:2012-03-05 21:44:20

标签: ruby datamapper

我似乎找不到任何方法可以成功地将十进制字段设置为表单中没有值,因为表单返回一个空字符串。这是一个超级简单的测试用例,可以手动将字段设置为''

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的一个非常基本的用例。

1 个答案:

答案 0 :(得分:2)

您可以为属性创建自己的setter方法以检查其类型。请参阅Datamapper properties documentation page上的“覆盖访问者”部分。

添加:

def list_price=(new_price)
  new_price = nil if new_price == ''
  super
end

到你的Product类将导致任何空字符串被设置为list_price的值被转换为nil,并允许保存资源。