Forum: Ruby on Rails HABTM - what am I doing wrong?

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
charlesleeds (Guest)
on 2005-11-12 13:49
(Received via mailing list)
For some reason, Rails keeps using the subject_id for id field in the
items_subjects table.  This causes a problem when I try to add a second
item with the same subject as a proceeding item.  I expect
items_subjects to be using the auto_increment for its id field instead
of manually setting it to the subject_id...

Below is my code.  I'm running Rails 0.14.3.

Thanks,
Charles

require 'rubygems'
require_gem 'activerecord'

class Item < ActiveRecord::Base
    has_and_belongs_to_many :subjects
end

class Subject < ActiveRecord::Base
    has_and_belongs_to_many :items
end

class Items_Subjects < ActiveRecord::Base

end

Item.establish_connection(
    :adapter     =>         'mysql',
    :host         =>         'localhost',
    :username    =>         'root',
    :password    =>        'password',
    :database    =>        'retainit_test'
)

Subject.establish_connection(
    :adapter     =>         'mysql',
    :host         =>         'localhost',
    :username    =>         'root',
    :password    =>        'password',
    :database    =>        'retainit_test'
)

Items_Subjects.establish_connection(
    :adapter     =>         'mysql',
    :host         =>         'localhost',
    :username    =>         'root',
    :password    =>        'password',
    :database    =>        'retainit_test'
)

Subject.delete_all
Item.delete_all
Items_Subjects.delete_all

Subject.create :name => "math"
Subject.create :name => "addition"
Subject.create :name => "subtraction"

@item = Item.new
@item.question = "1+1="
@item.answer = "2"
@item.save

@subject = Subject.find(:first, :conditions => "name = 'math'" )
@subject2 = Subject.find(:first, :conditions => "name = 'addition'" )
@item.subjects.push( [@subject, @subject2] )

@item = Item.new
@item.question = "4-4="
@item.answer = "0"
@item.save

@subject3 = Subject.find(:first, :conditions => "name = 'math'" )
@item.subjects.push( [@subject3] )


DROP TABLE IF EXISTS `retainit_test`.`items`;
CREATE TABLE  `retainit_test`.`items` (
  `id` int(11) NOT NULL auto_increment,
  `question` text,
  `answer` text,
  `difficulty` float default NULL,
  `stage` varchar(255) default NULL,
  `iteration` int(11) default NULL,
  `due` datetime default NULL,
  `lastlearned` datetime default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

DROP TABLE IF EXISTS `retainit_test`.`items_subjects`;
CREATE TABLE  `retainit_test`.`items_subjects` (
  `id` int(11) NOT NULL auto_increment,
  `subject_id` int(11) default NULL,
  `item_id` int(11) default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

DROP TABLE IF EXISTS `retainit_test`.`subjects`;
CREATE TABLE  `retainit_test`.`subjects` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(255) default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
This topic is locked and can not be replied to.