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