0
votes

I'm trying to create a many to many relationship between two models in Rails 3.2.11.

A User can be associated with many Incidents and vice versa.

class User < ActiveRecord::Base
  include ActiveModel::ForbiddenAttributesProtection

  has_many :incident_participants, foreign_key: "participant_id"
  has_many :participated_incidents, through: :incident_participants

end


class Incident < ActiveRecord::Base
  include ActiveModel::ForbiddenAttributesProtection

  has_many :incident_participants, foreign_key: "participated_incident_id"
  has_many :participants, through: :incident_participants

end

The join table:

class IncidentParticipant < ActiveRecord::Base
  include ActiveModel::ForbiddenAttributesProtection

  t.belongs_to :participant, class_name: "User"
  t.belongs_to :participated_incident, class_name: "Incident"
end

Table for IncidentParticipants

  create_table "incident_participants", :force => true do |t|
    t.integer  "participant_id"
    t.integer  "participated_incident_id"
    t.datetime "created_at",               :null => false
    t.datetime "updated_at",               :null => false
  end

So, why doesn't rails get this relationship? When I try to do @incident.participants in my view I get this error:

"Could not find the source association(s) :participant or :participants in model IncidentParticipant. Try 'has_many :participants, :through => :incident_participants, :source => '. Is it one of ?"

Any ideas?

2

2 Answers

1
votes

Try taking out the t.belongs_to and replace with belongs_to.

0
votes

To create a many to many association you should consider creating an association table. That is to say you will have two 1-M relationships that point to a sort interim table. For instance:

In your first model:

class Example < ActiveRecord::Base
  has_and_belongs_to_many :example2
end

In your second model:

class Example2 < ActiveRecord::Base
  has_and_belongs_to_many :example
end

Then you need to write a migration to link the two tables together:

class CreateTableExamplesExamples2 < ActiveRecord::Migration
  create_table :examples_examples2 do |t|
    t.integer :example_id
    t.integer :example2_id
  end
end

Then just let rails magic work. Check out the guides for more information.