在我的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
id
0 to 5
,null
也是""(.to_i = 0)
。如果未为阶段输入数据,则值为0
,在数据库中将其视为null
。如果阶段值为0
,我需要存储""
值,而不是{{1}}。
答案 0 :(得分:2)
检查字符串是否为空:
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
答案 1 :(得分: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
答案 2 :(得分:1)
有一个gem可以自动为您的模型中存在的每个属性执行此操作:
将此添加到您的Gemfile
并运行bundle install
:
gem 'nilly_vanilly'
此gem将任何空字符串转换为NIL值,以存储到您的数据库中。
======更新=====
我刚试过这个宝石而且它不起作用。我报告了它,开发人员说与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值以存储到您的数据库中(对于复制上述行的模型)。
因此,当它们为空字符串时,您不必手动将每个属性分配给NIL。