Gotjosh
Gotjosh

Reputation: 1049

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

I'm currently building two 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 two rails applications?

Upvotes: 22

Views: 10517

Answers (5)

klaffenboeck
klaffenboeck

Reputation: 6377

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.

Upvotes: 4

fl00r
fl00r

Reputation: 83680

You could try git submodule for that job.

http://git-scm.com/book/en/Git-Tools-Submodules

Upvotes: 0

Michael Graff
Michael Graff

Reputation: 485

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.

Upvotes: 1

mdesantis
mdesantis

Reputation: 8507

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

Upvotes: 1

Related Questions