2013-01-16 18 views
2

在我的model我有以下幾行代碼。如何通過ruby on rails給數據庫空值

hash_values = JSON.parse(question_hash) 
hash_values.each do |k,v| 
    b = UpdateData.new 
    b.question, b.answer, b.phase = v[0].to_i, v[1], v[2].to_i 
    b.save! 
end 

我有一個階段值的問題。 b.phaseid0 to 5,它也應該是null。當數據未輸入階段時,數值爲""(.to_i = 0),則在數據庫中將其視爲0。如果相位值爲"",我需要存儲null值,而不是0

回答

1

嘗試:

hash_values.each do |k,v| 
    b = UpdateData.new 
    b.question, b.answer = v[0].to_i, v[1] 
    b.phase = v[2].blank? ? nil : v[2].to_i 
    b.save! 
end 
+0

謝謝shweta ...它的工作...很好.. – Vinay

+0

嗨...謝謝...和一個懷疑...你會解釋我爲什麼我們使用雙重問號後空白?對於軌道上的紅寶石來說,這是非常新穎的。 – Vinay

+1

方法名是'blank?',所以這是一個問號,另一個是由於[三運算符](http://en.wikipedia.org/wiki/%3F :#Ruby)(或'內嵌if語句') – Veger

2

只是檢查是否字符串爲空:

if v[2].empty? 
    b.phase = nil 
else 
    b.phase = v[2].to_i 
end 

,或者使用一個很好的一個襯墊ternary operator

p.phase = v[2].empty? ? nil : v[2].to_i 
1

有一個gem能自動爲您的模型中現有的每個屬性執行此操作:

添加到您的Gemfile和運行bundle install

gem 'nilly_vanilly' 

這種寶石將任何空字符串轉換成NIL值是儲存到你的數據庫。

====== UPDATE =====

我只是嘗試這種寶石,它是行不通的。我報告了這個問題,開發者說它和postgreSQL不兼容。他正在修補寶石。目前,我最終創建了自己的圖書館。

只需創建文件的lib/my_model_tools.rb包含以下行:

module MyModelTools 
    private 

    def blank_string_attributes_to_nil 
     self.attributes.each do |attr_name, attr_value| 
     self.send("#{attr_name}=", nil) if attr_value.kind_of?(String) && attr_value == '' 
     end 
    end 
end 

然後,你必須添加這些行到每個應用程序/模型/ *文件:

require Rails.root.to_s + '/lib/my_model_tools.rb' 

class MyExampleModel < ActiveRecord::Base 

    include MyModelTools 
    before_validation :blank_string_attributes_to_nil 

    ... 

end 

這會將任何空字符串屬性轉換爲NIL值以存儲到您的數據庫中(對於複製以上行的模型)。

因此,當它們爲空字符串時,您不必手動將每個屬性分配給NIL。