I have two tables, media and tour_locations, related through a join
table. It's not a pure join, because I need a sequence number on the
relationship, so the join also has an id. When I access
"aMedium.tour_locations", the reported id's for the TourLocation's are
the id's from the join table, not the real id of the tour_locations row.
The same for "aTourLocation.media". In the sqlite3 console, the keys and
ids are all correct.
[snip]
class TourLocation:
class TourLocation < ActiveRecord::Base
has_and_belongs_to_many :media,
:join_table => "media_tour_locations",
:readonly => false
class Medium:
class Medium < ActiveRecord::Base
has_and_belongs_to_many :tour_locations,
:join_table => "media_tour_locations",
:readonly => false
Schema:
create_table "media", :force => true do |t|
t.string "url", :null => false
t.string "title", :default => ""
t.text "description", :default => ""
t.string "media_type", :default => "image", :null => false
end
create_table "media_tour_locations", :force => true do |t|
t.integer "medium_sequence"
t.integer "medium_id"
t.integer "tour_location_id"
end
create_table "tour_locations", :force => true do |t|
t.text "locDescription", :default => "Enter description",
:null => false
end
The has_and_belongs_to_many assumes that the join table doesn't have a
column called 'id' -- you'll see that the SQL it generates just
SELECTs an 'id' column, so it's (erroneously) picking up the one from
the join table in your situation.
If your join table is really a fully-fledged model of its own, then
you need to bring it into the association explicitly, and use the
:through option to connect media and tour_locations:
class Medium < ActiveRecord::Base
has_many :media_tour_locations
has_many :tour_locations, :through => :media_tour_locations
end
class MediaTourLocation < ActiveRecord::Base
belongs_to :medium
belongs_to :tour_location
end
class TourLocation < ActiveRecord::Base
has_many :media_tour_locations
has_many :media, :through => :media_tour_locations
end
Chris