QA@IT

複数のRailsプロジェクトでモデルを共有する方法はありますか?

4770 PV

同じデータベースを利用するRailsプロジェクトを複数作成する場合
モデル部分(およびヘルパーなど)を共有したいのですが、実現するにはどういった方法があるのでしょうか?

回答

gitなどリポジトリ上でのフォルダ構成を

/projects
  /app1
  /app2

のような構成にして、app1がマスターならば、app2のapplication.rbからapp1のモデルを

config.eager_load_paths << "#{app1_root}/app/models"

のように参照することで可能だと思います。

このやりかたの場合、rails root = git repo rootと仮定されている要素がいくつかあるので、そこだけ気をつける必要があります(多くはありません)。

具体的には、今すぐ思いつくところでいうとcapistranoで、それぞれのアプリのdeploy.rb上でlatest_release変数をdeploy:finalize_updateやbundle installの前後で書き換えてやる必要があります。あと当然ながら、デプロイ時にはapp1でもapp2でも/projects全体を配布する必要があります。

個人的には、複数のrailsプロジェクトっていうのでは経験がないのですが、rails + sinatraの構成でsinatraからrails側のモデルを使いたくて、いつも似たようなことをやっていました。ただ、最近ではもう上記のデプロイ時の面倒を避けるために、rails root = git repo rootとしてしまい、sinatraディレクトリをrails rootの下に掘るようになりましたが。。。

編集 履歴 (4)
  • ありがとうございます。参考になります。
    なるほど、config.autoload_pathsで実現する方法ですね。仰る通りdeproyに気を配らないとまずそうですね。
    -
  • Rails Engine を使ってモデルだけをまとめた gem を作り、http://www.gemfury.com/ でプライベートリリースしながら、双方の Gemfile で読み込むという方法もありますが、どうでしょうか?
    -
  • Engineもアリだとは思うのですが、Engineはどちらかというとadmin機能のようにUI heavyな要素を共有する場合に向いているという感想を持っています。モデルを共有するだけなら、autoload_pathsを使ったほうが簡単ではないでしょうか。 -
  • すいません、コメントに気づいてませんでした。
    yuki24さんkennさんアドバイスありがとうございます。

    Engine、autoload_paths 両方試してみます。
    -
ウォッチ

この質問への回答やコメントをメールでお知らせします。