Skip to content


Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Models talking about models
Ruby JavaScript
branch: master
Failed to load latest commit information.
app/models initial commit
lib use :attribute instead of :method in options hash
test initial commit
.gitignore updated gemspec
Gemfile initial commit
LICENSE updated gemspec updated readme
Rakefile updated rakegem / regenerated gemspec
hearsay.gemspec updated homepage


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'

class Comment < ActiveRecord::Base
  belongs_to :commentable, :polymorphic => true
  references :issues, :attribute => :body, :matcher => /#([0-9]+)/i, :finder => :find_by_number

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.

To do

  • tests


Contributions are welcome!

Something went wrong with that request. Please try again.