Railsのモデルのインスタンスは、カラム名の後に「?」を付けると値の有無を判定できる

f:id:ryoutaku_jo:20190807083055p:plain

【結論】

Railsでは、blank?present?で、オブジェクトの有無を判定することができる。

・モデルのインスタンスの場合、カラム名の後にを加えることで、属性(attribute)に値が入っているか判定することが出来る

・後者の方が、コードがシンプルになる為、Rails Best Practicesなどでは推奨されている

【目次】

【本題】

Railsでオブジェクトの有無を判定する方法

Railsでは、オブジェクトの有無を判定する為のメソッドとして、blank?present?などが存在します。

# 値が空の場合
@user.name = ''

@user.name.blank? 
=>true

@user.name.present?
=>falase

# 値がある場合
@user.name = 'ほげ助'

@user.name.blank? 
=>falase

@user.name.present?
=>true

Railsでオブジェクトの有無を判定する方法

ActiveRecordのプロパティであれば、プロパティ名の後にを加えることで、値の有無を判定することが出来ます

# 値が空の場合
@user.name = ''

@user.name? 
=>false

# 値がある場合
@user.name = 'ほげ助'

@user.name? 
=>ture

# 数値は0の時にfalseを返す
@user.number = 0

@user.number? 
=>false

これは以下のActiveRecordのコードから提供されている機能です。

rails/query.rb at v4.2.1 · rails/rails · GitHub

参考情報

Rails Best Practices - Use query attribute

ActiveRecordのプロパティにblank? や present? をする必要はなかった! - Qiita

Rails Best Practices の警告をちゃんと考える - Qiita

RailsのAttribute query methodsの挙動 | このコードわからん

《今日の学習進捗(3年以内に10000時間に向けて)》

・一括登録
ユーザー情報をCSVから一括登録する機能の実装を進めている。それにあたり、Userに紐づく子レコードのバリデーションを一括登録時は外す処理を組み込もうとしているが、現状見つかっていない。 詳しい調査はまだだが、一部の記事にはRails側に用意されていないと説明されていたりした為、別の方法を検討する必要があるかもしれない。 バリデーション周りの実装方法について再度調査した上で、対応を検討したい。

・文字化け対応
IECSVファイルとダウンロードすると、ファイル名が文字化けする事象が発生した。 UTF-8からshift-jisに変換することで、IE側の文字化けは解消されるが、その場合、Chromeで文字化けが発生してしまった。

OSに限らず、ブラウザ毎にも文字コードの対応状況に差異があるということを初めて認識した。 一旦はブラウザ毎に処理を切り分ける事になりそうだ。

文字コードの問題については、これまで何度も発生しており、バグの温床となっている。 現在開発中のユーザー一括登録でも恐らく文字コード関連の問題が発生することが想定されるので、慎重に進めたい。

・レビューの観点の整理
バグの見逃しを抑止する取り組みの一環で、レビューを実施する上での観点を洗い出して、プルリクエストのテンプレートに取りまとめている。 過去の障害事例などの踏まえて、出来るだけ網羅的にチェック項目を選定したが、項目数がかなり多くなってしまった。

チェック項目が多くなるほど、レビュワーの負担が増えて開発コストが増大したり、チェックが形骸化してしまう恐れがあるので、実際に運用するには、もう少し整理が必要だと感じる。 一方で、十分なチェックがなされていなければ、バグを見逃してしまう可能性が高まる。両方のバランスが取れたラインを探りたい。

学習開始からの期間 :242日
今日までの合計時間:2313h
一日あたりの平均学習時間:9.6h
今日までに到達すべき目標時間:2210h
目標との解離:103h
「10,000時間」まで、

残り・・・「7687時間!」