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!
You could take a look at:
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
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
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With