Rails and services - Architecture question

Hi guys!

We have moved a part of our Rails app into a "service", i.e. a Ruby script that is demonized and communicates with the main app through a message queue. This service needs to know about the models in the Rails app, but it does not need a database connection. Indeed, we are making sure that in this service, no call to the DB will be made.

How would you do that? At the moment, we are simply requiring the models files in the service. But since they inherit from ActiveRecord::base, it won't work if there is no connection to a DB available.

Thanks! Pierre

What are you doing with the models (in the service) that does not require a db connection?

Colin

Hi Pierre,

Hi Colin, Bill

Here is what we are doing:

- we pass to our "service" the Model objects (we Marshal.dump them in the main app, enqueue them, and the service Marshal.load them) instead of their unique ID. - in the service, we just need to access some of the models' methods. We know these methods don't need a DB connection.

The reason we have it setup like this is initially, we were running these tasks in threads within a background job (threads caused a bunch of issues when we were using the DB, so we made sure what we passed to the threads would never use the DB).

Bill: we run this service completely independently, on a different box. So it does not have access to the app.

Maybe we should not be doing something like this?

Thanks! PJ

Hi Pierre,

Hi Colin, Bill

Here is what we are doing:

- we pass to our "service" the Model objects (we Marshal.dump them in the main app, enqueue them, and the service Marshal.load them) instead of their unique ID. - in the service, we just need to access some of the models' methods. We know these methods don't need a DB connection.

Do you need knowledge of any of the attributes of the object that are database fields? If so then you need a connection to the db as it is by looking in the db that the model knows what its fields are and hence the attribute names.

The reason we have it setup like this is initially, we were running these tasks in threads within a background job (threads caused a bunch of issues when we were using the DB, so we made sure what we passed to the threads would never use the DB).

As Bill has suggested in his reply, you could extract the methods that do not need the database (if they really do not) out into helpers.

Colin

Thanks a lot guys for pointing me in the right direction. I ended up extracting the methods I needed from the models. It is much cleaner.

Thanks! PJ