2012-03-05 70 views
3

我似乎無法找到任何方法成功地將小數字段設置爲無格式的值,因爲表單正在返回空字符串。下面是手動將字段設置''無法將數值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場會很樂意節省超級簡單的測試案例。但是,當我使用空白字符串時,它根本不會保存 - 它看起來不是類型轉換。

看來我必須在這裏忽略一些明顯的東西,因爲這是ORM的一個非常基本的用例。

回答

2

您可以爲屬性創建自己的setter方法來檢查其類型。請參閱Datamapper properties documentation page上的「頂部訪問器」部分。

添加:

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

Product類將導致任何空字符串被設定爲list_price值轉換爲零,並允許要保存的資源。

+1

雖然這可以解決問題,但手動操作似乎是荒謬的。這不就是爲什麼我們有ORM嗎? – Emily 2012-03-06 00:00:57

+1

@Emily我發現這個相關的問題:https://github.com/datamapper/dm-core/issues/41。 「...我們決定DataMapper不負責將空字符串轉換爲nils」。他們承認,儘管它對webapps很有用。 – matt 2012-03-06 19:36:35

+0

有趣,謝謝。在我的搜索中,我沒有反駁過。不幸的是,它似乎並沒有像線程中所建議的那樣將它變成dm-rails。我結束了猴子補丁'typecast'來支持它。 – Emily 2012-03-06 20:28:31