プログラミングマガジン

プログラミングを中心にIT技術をできるだけわかりやすくまとめます。

  • ホーム
  • Ruby on Rails
  • 【Rails】「find_or_initialize_by」や「find_or_creat…
 
 
     
  • サーバー言語  
    • Python
    • Ruby
    • PHP
    • SQL
  •  
  • インフラ  
       
    • AWS
    •  
    • 基本
    • Git
  • Web
       
    • Web開発
    • JavaScript
    • Vue.js
    • React
  •  
  • 設計  
       
    • 実装設計
    • DB設計
  • 問い合わせ
  

【Rails】「find_or_initialize_by」や「find_or_create_by」について

02.06

  • miyabisan2
  • コメントを書く

この記事は2分で読めます

「find_or_initialize_by」や「find_or_create_by」とは?

Rails4以上で使えるようになったActiveRecordのメソッドです。

find_or_initialize_by

新規作成をして保存しない。既存テーブルにデータがあればfind_byの結果を返してくれて、なければnewしてインスタンスを作ってくれます。

用途

既に保存されているレコードかチェックして除去するために使います。例えば、バッチ処理の一括登録時に少しでも処理の負荷を軽減したりするために使います。

注意点

初期化するのとsave!するのが別に行われているのでもしマルチプロセス環境で並列で動かしている場合はユニーク制約がかかっているプロパティについて同じ値を持ったインスタンスが初期化されてどちらかが先にsave!されるとユニーク制約に引っかかる可能性がある。対策としてはユニーク制約のバリデーションを先に行うようにすると良いでしょう。

find_or_initialize_byの戻り値 = persisted?

データベースの保存状態や真偽値をチェックできます。インスタンスが保存されていないかつ今までに削除されていない時だけtrueを返します。

find_or_initialize_byの戻り値 = new_record?

データベースの保存状態や真偽値をチェックできます。インスタンスが保存されていない時だけtrueを返します。

find_or_create_by

対象を検索してない場合はcreateする。(find_or_initialize_byはnewですがこちらはcreateです。)

新規作成をして保存する。既存テーブルにデータがあればfind_byの結果を返してくれて、なければcreateの結果を返してくれます。

create_or_find_by(Rails6から)

「find_or_create_by」で適切な制約が設定されていない場合に重複エラー(ActiveRecord::RecordNotUnique)が常に発生していました。その対策として出てきたメソッドです。

新規作成(create)のtransactionに失敗(ActiveRecord::RecordNotUnique)したらfind_byします。createが先に実行されるため2つ同じデータが作成されてしまう可能性があるので注意です。

スポンサーリンク
  • 2021 02.06
  • miyabisan2
  • コメントを書く
  • Ruby on Rails
  • Tweets Twitter
  • このエントリーをはてなブックマークに追加
  • LINEで送る

関連記事

  1. 2020 03.15

    【Ruby on Rails】「フィクスチャ」について

  2. 2019 11.30

    【Ruby on Rails】マイグレーション、マイグレーションファイルの書き方

  3. 2020 12.26

    【Ruby on Rails】「serialize」や「store」について

  4. 2019 12.07

    【Ruby on Rails】CSVインポートやエクスポート機能について

  5. 2021 01.30

    【Ruby on Rails】「Enumrize」について

  6. 2020 09.16

    【Ruby on Rails】ビューヘルパー(エスケープ関連、タグ関連など)

  • コメント ( 0 )
  • トラックバック ( 0 )
  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

返信をキャンセルする。

【Ruby】JSONを処理する、ファイル、ディレクトリ…

【Rails】「devise_for」と「devise…

RETURN TOP

著者プロフィール

エンジニア歴10年で過去に業務系、Webデザイン、インフラ系なども経験あります。現在はWeb系でフロントエンド開発中心です。

詳細なプロフィールはこちら

スポンサーリンク

カテゴリー

  • Android
  • AngularJS
  • API
  • AWS
  • C++
  • CSS
  • cursor
  • C言語
  • DDD
  • DevOps
  • Django
  • Docker
  • Figma
  • Git
  • GitLab
  • GraphQL
  • gRPC
  • Hasura
  • Java
  • JavaScript
  • Kubernetes
  • Laravel
  • linux
  • MySQL
  • Next.js
  • nginx
  • Node.js
  • NoSQL
  • Nuxt.js
  • Oracle
  • PHP
  • Python
  • React
  • Redux
  • Rspec
  • Ruby
  • Ruby on Rails
  • Sass
  • Spring Framework
  • SQL
  • TypeScript
  • Unity
  • Vue.js
  • Webサービス開発
  • Webデザイン
  • Web技術
  • インフラ
  • オブジェクト指向
  • システム開発
  • セキュリティ
  • その他
  • データベース
  • デザインパターン
  • テスト
  • ネットワーク
  • プログラミング全般
  • マイクロサービス
  • マイクロソフト系技術
  • マルチメディア
  • リファクタリング
  • 副業
  • 未分類
  • 業務知識
  • 生成AI
  • 設計
  • 関数型言語
RETURN TOP

Copyright ©  プログラミングマガジン | プライバシーポリシー