如何通过rails模型上的ruby为数据库赋予空值

时间:2013-01-16 10:01:32

标签: ruby-on-rails ruby

在我的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 5null也是""(.to_i = 0)。如果未为阶段输入数据,则值为0,在数据库中将其视为null。如果阶段值为0,我需要存储""值,而不是{{1}}。

3 个答案:

答案 0 :(得分: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 :(得分: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。