find with has_many

Matthew Planchant wrote:

I have a model Person and one Organisation. A Person can belong to any number of Organisations and an Organisation can have any number of Persons attributed to it. As below:

====
class Person < ActiveRecord::Base
  has_many :person_organisations, :dependent => true
  has_many :organisations, :through => :person_organisations
end

class Organisation < ActiveRecord::Base
  has_many :person_organisations, :dependent => true
  has_many :persons, :through => :person_organisations
end

I'm writing an action on my Person controller called 'list_by_organisation' which will return all the contacts from a specified organisation. How do I achieve this?

Do I do something like the following? But what goes in the condition?

====
  def list_by_organisation
    @person_pages, @persons = paginate(:persons, :per_page => 20, :order => 'id', :conditions => [???])
    render_action 'list'
  end

If I'm doing this in completely the wrong way then please do let me know.

Thanks for any suggestions.

You need either has_and_belongs_to_many (if the join table has no attributes), in which case you don't need :through (AR does all that for you), or if the join table has attributes (e.g. date of joining) you need to declare that as a model (in which case I'd prob just call it membership).

In your Person controller you could do something like @organisations = Organisation.find(:all, :include => :persons) if you want all the organisations, and then in your view iterate through them:

<% @organisations.each do |organisation| %>
    <h1><%= h(organisation.title) %></h1>
    organisation.persons.each do |person|
        <p><%= h(person.name) %></p>
    <% end %>
  <% end %>

or if you just want members of a specific organisation (identified by, say, params[:organisation_id])
    @persons = Organisation.find(params[:organisation_id]).persons

Or something like that.

HTH
CT
p.s. I think rails by default uses people as the plural of persons (so should be has_many :people, not has_many :persons, ditto all the other persons)