2

在我的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有一个id0 to 5它也应该是null。当没有为阶段输入数据时,该值被""(.to_i = 0)视为0在数据库中。我需要存储一个null值而不是0相位值是否为"".

4

3 回答 3

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
于 2013-01-16T10:08:33.680 回答
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
于 2013-01-16T10:06:36.410 回答
1

对于模型中存在的每个属性,有一个gem可以自动为您执行此操作:

将此添加到您的Gemfile并运行bundle install

gem 'nilly_vanilly'

此 gem 会将任何空字符串转换为 NIL 值以存储到您的数据库中。

====== 更新 =====

我刚刚尝试了这个 Gem,但它不起作用。我报了,开发者说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。

于 2013-02-06T12:46:23.003 回答