Ruby on Railsで親子レコードをDBに複数同時保存!不整合を防ぐ

こんにちは!ピジョンです!

今日はruby on railsのtipsについて紹介していきたいと思います!

RDBを運用していると親子レコードを同時に保存しないとデータベースに不整合が起こってしまう場面がでてくると思います。

てか僕はでてしまいました。笑

その時に検索してもなかなかいい記事に巡り会えなかったので、僕が調べた内容を共有したいと思います。

ControllerとModelの2箇所にコードの記述が必要になります!

順番にみていきましょう!

スポンサーリンク

Controllerに追加するコード

親レコードを保存する前に子レコードを追加するためにはbuildメソッドを使用します。

具体的には以下のように書きます。

child = parent.children.build(:hoge => hoge)

ここでchildは子供インスタンス、parentは親インスタンスになります。

親子がhas_manyの関係にある場合を想定しています。

buildメソッドを使用すると親にIDが生成される前に子供レコードを作成する(子供に親IDを持たせる)ことが可能になります。

親レコードをsaveメソッドで保存するタイミングで子レコードも同時に保存されます。

念のためにsaveメソッドの記述方法も記しておきます。

parent.save

スポンサーリンク

Modelに追加するコード

モデル側にはaccepts_nested_attributes_forというコードを書き足さないといけません。

親レコードのclassの中に

accepts_nested_attributes_for :children

という行を加えてください。ここでchildrenというのは子レコードになります。

このコードにより子供レコードの同時保存することができるようになります。

特筆する必要はないかもですが、親レコードのclassの中には、他には

has_many :children

などの行があると思います。

また子レコードのclassに関して、親レコードのIDに関してのValidationは除外してください。

validatesからはじまるコードの部分です。

スポンサーリンク

親子レコード同時保存が必要な場面

主に必要となるのは常にDBにレコードが追加されたら即コンテンツが投下されるアプリケーションです。

私の場合はDB内容のストリーミング表示を行なっていました。

そのDBレコードに大量の子供達がいる場合、その子供達全ての保存が完了する前に新規レコードがポストされてしまうことになります。

サーバー側のDB保存のコントローラー処理とクライアント側のDB問い合わせ処理が同時に行われてしまうためですね。

DBの不整合を起こさないために親子関係にあるレコードの同時保存は重要になってきます。

  

いかがでしたでしょうか。

アプリが複雑になってくるほど細かい部分に気を配らないとバグが出てきてしまいますよね。

基本的にはバグが起こってから対処する方針で大丈夫かとは思いますが、同じバグにはすぐ対応できるように知識を体系化しておきたいものです。

それでは今日はこのへんで。また。

スポンサーリンク

シェアする

  • このエントリーをはてなブックマークに追加

フォローする