0
0

More than 1 year has passed since last update.

[Rails]実務を通しての実装ノウハウ集

Last updated at Posted at 2022-10-12

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)という組み合わせ順で処理が進む。
0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0