もふもふ技術部

Railsで一括登録処理をしたいのでGitLabのソースコードを参考にする


パラメータから受け取って生成したModelで単純にループして登録するだけの処理ならControllerで実装しちゃっても良いけど、もうちょっと実装のボリュームがありそうだったのでModelに実装したい。

Modelに実装したいときどういうIFにしたら良いか参考にしたかったのでGitLabを調べみた。eachでループしてActiveRecord#saveを実行しているだろうと仮定して「save」という文言でgrepした。そのうちの一つを紹介する。

ソースコード貼る

一応行っておくとGitLabはオープンソースになっているGithubのクローンプロジェクトですね。

demo
http://demo.gitlab.com

リポジトリ
https://github.com/gitlabhq/gitlabhq

app/models/users_project.rb

UsersProject#add_users_into_projects に一括登録処理を見つけた。複数projectに複数userを一括で登録する処理みたい。

UsersProject.transactionでトランザクション管理されてる。例外が発生してもちゃんと登録がロールバックされますね。

戻り値はbooleanのtrue/false。例外が発生したらfalseでそれ以外はtrueで返します。project_access 〜 の部分で権限をチェックしてますね。権限がなければ例外を投げてrescueでfalseで返してる。

呼び出し元にはどういう理由でfalseなのかっていうのは返さないのか。

app/models/project_team.rb

#add_users_into_projects の呼び出し元を探る。別モデルであるProjectTeamモデルから呼ばれてる。特筆すべきことはない。

さらに#add_user, #addusersの呼び出し元を調べると同じProjectTeamモデル内から呼ばれている。

<<メソッドで実装してた。メソッド名を<<にすることでコメントにあるように、@team << [@user, :master] という呼び方が出来るのでArray#<<と同様に、「チームにユーザーを追加」っていう挙動が直感的に分かる。 addなんちゃらってメソッドを書きたい場合は、メソッド名を<<にすると良さそう。今後やってみよう。 結局 ProjectTeam#<< を呼び出している箇所は見つからなかった。。。まあいいか。

The following two tabs change content below.
原田 敦

原田 敦

日本CAWのエンジニア。もふもふ部の部長。得意分野はRuby on Railsを使った小規模WEBアプリケーションを高速で開発すること。週末の楽しみは一人お菓子パーティー。三度の飯より小動物をもふもふするのが好きです。