在我的model
中,我有以下代码位。
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.phase
有0 to 5
的id
,它也应该是null
。当该阶段没有输入数据时,值为""(.to_i = 0)
,它在数据库中被认为是0
。如果相位值是""
,我需要存储null
值而不是0
。
检查字符串是否为空:
if v[2].empty?
b.phase = nil
else
b.phase = v[2].to_i
end
或者使用三元操作符的一行符:
p.phase = v[2].empty? ? nil : v[2].to_i
尝试:
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
有一个gem可以为你自动完成模型中存在的每个属性:
将此添加到Gemfile
并运行bundle install
:
gem 'nilly_vanilly'
此gem将把任何空字符串转换为NIL值,并存储到您的DB中。
====== 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
然后你必须将这些行添加到每个app/models/*文件中:
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值,并存储到您的DB中(对于复制上述行的模型)。
因此,当每个属性都是空字符串时,您将不必手动将它们分配给NIL。