jeremy dean
2006-Feb-28 21:47 UTC
[Rails] Confusion with counter and single table inheritance
I''m having trouble getting the magical counter to work in a rails app with single table inheritance. following is the relevant code. thank you class declarations class Job < ActiveRecord::Base has_many :vents end class Vent < ActiveRecord::Base belongs_to :job, :counter_cache => true validates_numericality_of :width end class Rectangular < Vent validates_numericality_of :height end table declarations CREATE TABLE `jobs` ( `id` int(10) unsigned NOT NULL auto_increment, `name` char(40) NOT NULL default '''', `user_id` int(11) NOT NULL default ''0'', `vents_count` int(11) default ''0'', `created_at` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, `updated_at` timestamp NOT NULL default ''0000-00-00 00:00:00'', `total` decimal(12,2) unsigned default ''0.00'', `address_id` int(11) NOT NULL default ''0'', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE `vents` ( `id` int(10) unsigned NOT NULL auto_increment, `type` char(20) NOT NULL default '''', `width` int(10) unsigned default NULL, `height` int(10) unsigned default NULL, `rise` int(10) unsigned default NULL, `left` tinyint(3) unsigned default NULL, `right` tinyint(3) unsigned default NULL, `job_id` int(10) unsigned default ''0'', `created_at` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, `updated_at` timestamp NOT NULL default ''0000-00-00 00:00:00'', `price` decimal(10,2) unsigned NOT NULL default ''0.00'', `free_area_in` float default NULL, `free_area_ft` float default NULL, `active` tinyint(3) unsigned default ''1'', `flange_id` int(10) unsigned NOT NULL default ''0'', `order_id` int(10) unsigned default NULL, `quantity` int(10) unsigned NOT NULL default ''1'', `square_feet` float default ''0'', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; controller code def create @job = Job.find(session[:job]) @type = @params[:vent][:type] case @type when "Rectangular" @vent = Rectangular.new(@params[:vent]) end if @vent.save flash[:notice] = ''Vent was successfully created.'' redirect_to(:controller => ''/store'', :action => ''show'', :id => session[:job]) else render :action => ''new'' end @job.vents << @vent end