The simplest way to ensure that a given task is only executing once at a time is to work outside the queuing system and work with some kind of lock in the database. ActiveRecord's optimistic locking combined with a "job in process at" timestamp should be sufficient. The caveat is that you need to be prepared to deal with the worker process crashing/the server going down/etc. and leaving the timestamp in place. Having the timestamp be ignored after a certain period might work for you.
If you can get away with allocating only a single worker process per type of job, obviously that would work. If you can segment out your queue into smaller classes of job, each served by only one worker, you can still perform jobs concurrently without doing the same job more than once at a time. I've taken this approach in situations where I have a particular class of long-running, resource-intensive jobs that I can't afford to run more than once at a time per node.
Finally, the approach I'm working on right now is an external (on another machine, preferably) watchdog service which keeps track of the unique ID of jobs and the unique ID of the workers which are handling them. If the job doesn't finish and the worker has gone away, the watchdog can reissue the job (and unlock the record so a new job can run against it.)