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にはidof が0 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

モデルに存在するすべての属性に対して自動的にそれを行うことができるgemがあります:

これをに追加してGemfile実行しますbundle install

gem 'nilly_vanilly'

このgemは、空の文字列をNIL値に変換して、DBに保存します。

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

この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値に変換され、DBに保存されます(上記の行をコピーするモデルの場合)。

したがって、空の文字列の場合、各属性を手動でNILに割り当てる必要はありません。

于 2013-02-06T12:46:23.003 に答える
1

Try:

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 に答える