如何通过ruby on rails模型给数据库空值



在我的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.phase0 to 5id,它也应该是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。

最新更新