I've created the following associations using :through:
class Person < ActiveRecord::Base has_many :attendees, :dependent => :destroy has_many :events, :through => :attendees, :uniq => true end
class Event < ActiveRecord::Base has_many :attendees, :dependent => :destroy has_many :people, :through => :attendees, :uniq => true end
class Attendee < ActiveRecord::Base belongs_to :event belongs_to :person end
The database tables are as follows:
ActiveRecord::Schema.define(:version => 3) do
create_table "attendees", :id => false, :force => true do |t| t.column "event_id", :integer t.column "person_id", :integer t.column "bit_flags", :integer end
add_index "attendees", ["event_id"], :name => "index_attendees_on_event_id" add_index "attendees", ["person_id"], :name => "index_attendees_on_person_id"
create_table "events", :force => true do |t| t.column "name", :string t.column "description", :text t.column "event_date", :date t.column "start_time", :time t.column "end_time", :time t.column "last_register_date", :date t.column "location_city", :string t.column "location_state", :string, :limit => 2 t.column "location_zip", :string, :limit => 9 t.column "location_addr", :text t.column "agenda", :text t.column "contacts", :text end
create_table "people", :force => true do |t| t.column "first_name", :string t.column "last_name", :string t.column "title", :string t.column "organization", :string t.column "email", :string t.column "phone1", :string t.column "phone2", :string end
end
I wanted to use the following method which the documentation indicates is available for has-many associations. (See (http:// rails.rubyonrails.com/classes/ActiveRecord/Associations/ ClassMethods.html) :
collection=objects - replaces the collections content by deleting and adding objects as appropriate.
That's because I want to eliminate redundant join records, i.e., there should be only one record in the attendees table that contains the combination of event_id=1 and person_id=1. I took "deleting and adding objects _as appropriate_" to mean that. Is this true?
Secondly, trying this code in class PeopleController:
@person.events = Event.find(@params[:event_ids]) if params[:event_ids]
resulted in the following error:
undefined method `events=' for #<Person:0x6836228>
So, did I get something wrong or is this method not available with :through associations?
If not available, is there another (best?) method or combination that would maintain the attendees table so that event_id + person_id combinations are unique?
btw, I also tried the following:
@person.events << Event.find(params[:event_ids]) if params[:event_ids]
It works, but adds (appends) join records without regard to uniqueness.
Thanks, Stan