1. チェック対象値が指定の範囲に含まれるか(数値・時間)
(【開始値】..【終了値】).cover?(【チェック対象値】)
補足:
- 【開始値】 <= 【チェック対象の値】 <= 【終了値】になっているかをチェックする
- 数値的な範囲、日時的な範囲のチェック に使える
-
日時のチェックに使う場合
- 【開始値】、【終了値】のいずれかがnilである場合は、十分に過去の日時 or 未来の日時 として扱われる
- 類似の実装として
【チェック対象の値】.between?(【開始値】, 【終了値】)
ということもできるが、こちらは 【開始値】、【終了値】どちらかがnilである場合エラーとなってしまう
2. 配列要素の重複チェック
2.1. どの要素が重複しているかわからなくてもいい場合
# true:重複あり, false:重複なし
【配列】.size != 【配列】.uniq.size
2.2. どの要素が重複しているか知りたい場合
# dup_valuesは重複値の配列
dup_values = 【配列】.group_by{ |elem| elem }.reject{ |_k, v| v.one? }.keys
if dup_values.present?
p "重複値: #{dup_values}"
end
参考:
3. レシーバとメソッドの存在を考慮したnilガードでの実装
3.1. クラスの場合
# レシーバが存在しない場合nilメソッドが存在しない場合エラー
# (&.はtry!でもOK)
【レシーバ】&.【メソッド】
# レシーバが存在しない場合もしくはキーが存在しない場合nil
# (tryには&.の効果に加え、対象のメソッドが存在しないならばnilを返すという効果がある。
# &.の場合は対象のメソッドが存在していない場合エラーになる)
【レシーバ】&.try(:【メソッド】)
3.2. ハッシュの場合
# ハッシュのインスタンスが存在しない場合nil、キーが存在しない場合エラー
【ハッシュ】&.fetch(:【キー】)
# ハッシュのインスタンスもしくはキーが存在しない場合nil
# (tryと使おうとすると、&.try(:fetch, :【キー】, nil)になるので、こちらの方がシンプル)
【ハッシュ】&.fetch(:【キー】, nil)
4. DBに存在するテーブル名を確認
Rails Consoleで実行する想定
4.1. 一覧表示
ActiveRecord::Base.connection.execute('show tables').map { |a| p a.first }
4.2. 特定のテーブル名がDBに存在するか
ActiveRecord::Base.connection.execute('show tables').map { |a| p a.first }.select { |table| table.in?(["【存在確認したいテーブル名1】", ..., "【存在確認したいテーブル名N】"]) }
5. ループ処理
5.1. .allのループ
【モデル名】.find_each { |record| 【処理】 } |
補足:
【モデル名】.all.each { 【処理】 }
としたくなるが、レコード数多い場合は、それをすべてメモリ上に展開するため、負荷が高くなる。find_eachを使うべきとのこと
参考:
5.2. 全ての配列要素の組み合わせ(自身同士を除く)のループ
※他言語でいうところの
for(i = 0; i <= 【maxなインデックス値】 - 1; i++) {
for(j = i + 1; i <= 【maxなインデックス値】; j++) {
< 【配列】[i], 【配列】[j]を使った処理 >
}
}
という処理。
rubyでは、以下のように書ける。
【配列】.combination(2).each { |elem1, elem2| 【elem1, elem2を利用した処理】 }
# 例えば、【配列】 = [【要素1】,...,【要素4】]だった場合は
# (要素1,要素2),(要素1,要素3),(要素1,要素4),(要素2,要素3),(要素2,要素4),(要素3,要素4) という組み合わせ順で処理が進む。
5.2. 前後の配列要素の組み合わせのループ
【配列】.each_cons(2).each { |elem1, elem2| 【elem1, elem2を利用した処理】 }
# 例えば、【配列】 = [【要素1】,...,【要素4】]だった場合は
# (要素1,要素2),(要素2,要素3),(要素3,要素4)という組み合わせ順で処理が進む。