has_many :through selections based on attributes of the :through table.

Hi all,

I'd like to get your feedback on the easiest way to find records that are related via has_many :through based on options in the :through table. Suppose an Author has_many Books :through a table called Authorships. The Authorships table is defined as:

  create_table "authorships", :force => true do |t|     t.belongs_to :author     t.belongs_to :book     t.string "role"   end

The "role" can either be "contributor" or "primary author". The model definitions are:

class Author < Active Record::Base   has_many :books, :through => :authorships end

class Book < ActiveRecord::Base   has_many :authors, :through => :authorships end

class Authorship < ActiveRecord::Base   belongs_to :author   belongs_to :book end

So supposing I have a Book, how can I find all of the authors whose role is defined in the :through table as "contributor"?

Similarly, if I have an author, how can I find all of the books that the author is the "primary author" of?

Thanks!

Neal L wrote:

Hi all,

I'd like to get your feedback on the easiest way to find records that are related via has_many :through based on options in the :through table. Suppose an Author has_many Books :through a table called Authorships. The Authorships table is defined as:

  create_table "authorships", :force => true do |t|     t.belongs_to :author     t.belongs_to :book     t.string "role"   end

The "role" can either be "contributor" or "primary author". The model definitions are:

class Author < Active Record::Base   has_many :books, :through => :authorships end

class Book < ActiveRecord::Base   has_many :authors, :through => :authorships end

class Authorship < ActiveRecord::Base   belongs_to :author   belongs_to :book end

So supposing I have a Book, how can I find all of the authors whose role is defined in the :through table as "contributor"?

book.authors.find :all,    :conditions => {'authorships.role' => 'contributor'}

Similarly, if I have an author, how can I find all of the books that the author is the "primary author" of?

author.books.find :all,    :conditions => {'authorships.role' => 'primary author'}