🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Active Record

Active Recordは、一つのオブジェクトに対しドメインのロジックとストレージの抽象性を結合するデザインパターンです。

Q&A

解決済

2回答

2703閲覧

before_createとbefore_saveの実行タイミングが分からない

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Active Record

Active Recordは、一つのオブジェクトに対しドメインのロジックとストレージの抽象性を結合するデザインパターンです。

0グッド

0クリップ

投稿2020/11/26 06:22

railsガイドを読んでいて理解できない箇所がありました。

引用

Active Recordで利用可能なコールバックの一覧を以下に示します。これらのコールバックは、実際の操作中に呼び出される順序に並んでいます。

before_validation
after_validation
before_save ←←
around_save
before_create ←←
around_create
...
...
...

(詳しくはリンク内容

自分の認識

上記では、before_createより前にbefore_saveが呼び出されると記載されています。(矢印部分)
しかし、私はここが理解できません。

自分の認識では、createとは「インスタンスが作成され、dbに保存される」ことだと思っています。
なので、モデルにbefore_createを記述した場合、それが実行されるタイミングは

def create #ここでbefore_createが実行される。 @u = User.new(...) @u.save ... ... end

という認識でいます。

また、saveとは「インスタンスがdbに保存される」ことだと思っています。
なので、モデルにbefore_saveを記述した場合、それが実行されるタイミングは

def create @u = User.new(...) #ここでbefore_saveが実行される @u.save ... ... end

という認識でいます。

しかし仮に、モデルにbefore_saveとbefore_create両方を記述すると、

def create #ここでbefore_createが実行される @u = User.new(...) #ここでbefore_saveが実行される @u.save ... ... end

になると認識しています。

従って、仮にbefore_createとbefore_saveが記述されている場合、呼び出される順序は
before_createの次にbefore_saveが正しい順序になるのではと思ってしまいます。

私の認識違いを正していただきたいです。詳しい方がいましたら、よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

モデルの動きとして、 save と create の違いとか順序とかとは別の話です。

before_save と before_create と両方にアクションを書き
かつ
両方共実行されるような条件の場合に

2つのアクションのどちらが先に実行されるのか、を説明しています。

投稿2021/02/28 04:16

winterboum

総合スコア23567

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

モデルにbefore_createを記述した場合、それが実行されるタイミングは(中略)という認識でいます。

違います。単に「新規作成したモデル」に対するbefore_save的な位置づけです。

なお、「モデルインスタンス作成時」に実行されるコールバックとして、after_initializeがあります。

投稿2020/11/26 06:26

maisumakun

総合スコア145967

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2020/11/26 06:28

こういった箇所は、Railsの利用者が変更できる箇所でも、また(多くのGemがRails標準の順でコールバックが動くことを前提として作られている以上)変更すべき箇所でもありませんので、理解ではなく覚えるしかない箇所です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問