Skip to content
A database client independent way of managing relationships between models backed by different databases.
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Type Name Latest commit message Commit time
Failed to load latest commit information.



Tenacity inactive

Please be aware that tenacity is an inactive project. I am not actively working on it, nor am I accepting pull requests at the moment. If you are interested in taking over the project, please let me know.


A database client independent way of managing relationships between models backed by different databases.

It is sometimes necessary, or advantageous, to use more than one database in a given application (polyglot persistence). However, most database clients do not support inter-database relationships. So, writing code that manages relationships between objects backed by different databases hasn’t been nearly as easy as writing code to manage relationships between objects in the same database.

Tenacity aims to address this by providing a database client independent way of managing relationships between models backed by different databases.

Tenacity is heavily based on ActiveRecord's associations, and aims to behave in much the same way, supporting many of the same options.


class Car
  include MongoMapper::Document
  include Tenacity

  t_has_many :wheels
  t_has_one  :dashboard

class Wheel < ActiveRecord::Base
  include Tenacity

  t_belongs_to :car

class Dashboard < CouchRest::Model::Base
  include Tenacity
  use_database MY_COUCHDB_DATABASE

  t_belongs_to :car

car = Car.create

# Set the related object
dashboard = Dashboard.create({})
car.dashboard = dashboard

# Fetch related object from the respective database

# Fetch related object id

# Set related objects
wheel_1 = Wheel.create
wheel_2 = Wheel.create
wheel_3 = Wheel.create
wheels = [wheel_1, wheel_2, wheel_3]
car.wheels = wheels

wheel_1.car_id    #

# Fetch array of related objects from the respective database
car.wheels        # [wheel_1, wheel_2, wheel_3]

# Fetch ids of related objects from the database
car.wheel_ids     # [,,]

# Add a related object to the collection
new_wheel = Wheel.create
car.wheels << new_wheel
car.wheels        # [wheel_1, wheel_2, wheel_3, new_wheel]

Additional Usage Details

  • The directories that contain your model classes must be in your load path in order for Tenacity to find them.

Supported Database Clients

  • ActiveRecord

  • CouchRest (CouchRest::Model and ExtendedDocument)

  • DataMapper

  • MongoMapper

  • Mongoid

  • Ripple

  • Sequel

  • Toystore

See EXTEND.rdoc for information on extending Tenacity to work with other database clients.


Contributing to Tenacity

  • Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet

  • Check out the issue tracker to make sure someone already hasn't requested it and/or contributed it

  • Fork the project

  • Start a feature/bugfix branch

  • Commit and push until you are happy with your contribution

  • Make sure to add tests for it. This is important so I don't break it in a future version unintentionally.

  • Run the tests in ruby 1.8.7 and 1.9.2 on the master and active_support_2_x branches

  • Please try not to mess with the Rakefile, version, or history. If you want to have your own version, or is otherwise necessary, that is fine, but please isolate to its own commit so I can cherry-pick around it.


  • Ruby 1.9.3 is required.

  • SQLite, MongoDB, Riak, and CouchDB must be installed, configured, and running.

  • Install the dependencies

    bundle install

  • Run the tests

    rake test

  • Code away!


Copyright © 2012 John Wood. See LICENSE.txt for further details.

You can’t perform that action at this time.