Hearsay is a plugin for Ruby On Rails that allows attributes of a model to loosely reference other models.
Add the gem to your Gemfile:
$ cat Gemfile ... gem 'hearsay' ...
Install it with bundler:
$ bundle install
Run the generator to get the migration, and then migrate your database:
$ rails generate hearsay $ rake db:migrate
Hearsay gives you two new class methods on your models:
- references association_name, options
- referenced_by association_name, options
The best way to explain the behavior is by example. Say I have a help desk app with the following models:
class Issue < ActiveRecord::Base has_many :comments, :polymorphic => true referenced_by :referencing_comments, :attribute => :body, :class_name => 'Comment' ... end class Comment < ActiveRecord::Base belongs_to :commentable, :polymorphic => true references :issues, :attribute => :body, :matcher => /#([0-9]+)/i, :finder => :find_by_number ... end
Next, I create a few issues, and finally a comment on one of them:
Issue.create(:number => 1) issue = Issue.create(:number => 2) issue.comments.create(:body => 'This comment also references Issue #1.')
When the comment on issue #2 is created, a Reference object is automatically created that also connects the comment to issue #1. This can be used to link to related issues in HTML output, or for any other situation where you might want to get at the originally referenced objects without re-scanning the body attribute. This is also handy if you want to search for comments that reference a specific issue, for instance.
Contributions are welcome!