Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Share Models between 2 Rails API's (Separate Applications)

I'm currently building 2 API's using Ruby on Rails. One if for reading (finding objects, querying) and the other one is for actually writing to it, involving a kind of complicated process with queues and another API. Both applications require the exact same models and logic inside them.

My question is, what's the most common best practice or approach to share models specifications (relationships, scopes, methods) between 2 rails applications?

Thank you!

like image 810
Gotjosh Avatar asked May 07 '12 19:05

Gotjosh


4 Answers

You could take a look at:

  • Best way to share ActiveRecord models and data between different Rails Apps?
  • Two rails apps sharing a model folder
  • Shared models between two Rails apps - what is the ideal solution for Workflow?
like image 165
Nigel Thorne Avatar answered Oct 22 '22 04:10

Nigel Thorne


The way I would do it is a 'Mountable Engine'. Check out the excellent Railscast by Ryan Bates for starters and the engine-section at api.rubyonrails.org for further details.

With best regards, Mandi

like image 36
klaffenboeck Avatar answered Oct 22 '22 02:10

klaffenboeck


If you just want to share models, you can add the other project models folder into your autoload paths:

rails new test1
rails new test2
cd test1
rails g model User 
cd ../test2/
# ACTION REQUIRED: edit config/application.rb adding this line
# inside the class Application < Rails::Application block:
#
# config.autoload_paths += %W(#{config.root}/../test1/app/models)
#
mkdir db/migrate
cp ../test1/db/migrate/*_create_users.rb db/
mv db/*_create_users.rb db/migrate/
rake db:migrate
rails r 'puts User.inspect' 
#=> User(id: integer, created_at: datetime, updated_at: datetime)

You can also set the whole thing in order to have the two app/models folders as private, using a third shared folder, adding this to the projects:

# config.autoload_paths += %W(/path/to/a/shared/folder)

This folder can even be not the same folder for each project, so it could be a path to a git submodule , for example (if you use GIT, I reccomend this solution).

Another option could be pointing app/models to a shared folder with a soft link

like image 1
mdesantis Avatar answered Oct 22 '22 02:10

mdesantis


My trick for doing this is to not actually use Rails tricks. I use "git" tricks, and pull in code from a 3rd, shared-code repo. I put this into both apps as an engine, and as an external git reference.

It's a little more work, but once you have done it once in one app, it's easy to use that as a template for the next one, too.

like image 1
Michael Graff Avatar answered Oct 22 '22 02:10

Michael Graff