Ruby
Rails

よちよちrubistがハマった備忘録

言われてみればあたり前田のクラッカーだが得心するまで微妙にどっちだったか?と考えてしまうことが何度かあったので備忘録として残しておく。
わかりにくいこと、わかったが忘れそうなことのメモ置き場として適宜更新追加していく予定。

rails、基本的に便利なのだけどいろいろな書き方ができるのでわかったときは「なるほど!」となるがしばらくして「確かこういうケースのときはもっとRails Wayな書き方があったけどどうやるんだっけ?」みたいなことが起こりがち。

慣れてしまえばいいんだけど他言語から入ってきた勢としてはなかなかスイッチングコストが大きい。

あとタイトルでrubistと書いてるがほぼrailsの話し。

モデルは単数形、belongs_toは単数形、has_manyは複数形

モデルは単数形(Railsの思想的な問題?)

belongs_toなど対象が単数であることが自明なら単数、has_manyのようにモデルだが複数所有するケースは複数形になる。

belongs_to :item

has_many :items

言われてみればまあそうだなって話しなんだけど最初は「こっちは単数形だけどこっちは複数形…え?どういうこと???」ってなった。

validateでハマったところ。

validates :name, length: {in: 1..10_00_00}

みたいな実装があり、これがエラーにならなくて「どう解釈されているのか?」と思ってたがrubyではこの実装をしてもエラーにはならない。

理由は数字の連結を行っていると解釈されるため。

Ruby 文字列と数値の連結

つまり1..1000001..10_00_00は等価。
元々はお金とか数字が大きい際の区切り文字として入れておくことで人間に優しくなるということだと思うのだけど使ってる場所が悪く理解するのに時間がかかった。
なお問題の箇所で使われていた_はただのタイポだった。

三項演算子よりもrails wayな実装

before:

result = rows.present? ? rows : "エラーメッセージとか空配列とか指定するよ"

after:

result = rows.presence || "エラーメッセージとか空配列とか指定するよ"

present?true/falseを返すがpresenceは成功なら自身を返す。
この場合はrowsが返り、失敗するとfalseが返る。

そしてRubyの構文で[A] || [B]を使用しているため、AがtrueでなければBを返す…という実装になっている。
そういえば最初の頃は[A] || [B]という書き方になれなかったが最近だいぶ考えずにすっと読めるようになってきた。
似た書き方にresult ||= "デフォルト値だよ"とかもある。

こういうの地味にググりにくく困ることがある。