環境
Ruby 2.6
はじめに
SIerで長らくエンジニアをしていた自分は、もっぱらVBer(造語)でした。多くのVBerを悩ませた問題の一つにnull問題がありす。nullはOracleにもSQLServerにも存在する概念です。業務アプリを開発する現場では避けて通ることはできません。とにかくこのnullですが、便利などころか厄介モノ扱いでした。VBerから離れてRubyerになった現在でも、null問題はついて回ります。nullという概念はPostgreSQLにもMySQLにも同じように存在します。Rubyでnull(正確にはnil)をスマートに扱う方法について書いてみました。
VBでnullを扱う
VBでnullを扱う場合、nullを""に変換する関数を作成して対応していました。型をVariantにしているのは、どのような型にもオールマイティに対応するためです。もちろん、nullにも対応させる必要があります。Variant型にすると処理が重くなるといった副作用が発生しますが、いたしかたありません。また、Trimをかけて、空白スペースが入っていた場合は""に変換しています。このような関数を作成して各項目に対応していました。
Public Function NullPadS(vData As Variant) As String
If IsNull(vData) = True Then
NullPadS = ""
Else
NullPadS = Trim$(vData)
End If
End Function
Rubyでnullを扱う
Rubyでnullを""に変換するメソッドを作ると次のようになります。VBよりも随分とシンプルなコーディングになりました。if文がワンライナーで書けるといった利点もあります。
def test_nil(data)
data.nil? ? "" : data.to_s.strip
end
実は、Rubyの場合、メソッドを作成しなくても、変数に下記を付けただけでも対応ができるようになります。null.to_sをすれば、""になってくれます。100.to_sは、"100"になってくれます。これで、変換用のメソッドを作成する必要はありません。
data.to_s.strip
動作確認
puts nil.to_s.strip >= ""
puts "".to_s.strip >= ""
puts " ".to_s.strip >= ""
puts 11.to_s.strip >= "11"
puts "aa".to_s.strip >= "aa"
puts " bb ".to_s.strip >= "bb"
puts " 22 ".to_s.strip >= "22"