johnmann@mannandassociatescpa.com
2006-Jul-08 17:24 UTC
[Rails] Need Help Understanding Situation with Table Columns
I am trying to create an application loosely based on the Depot application presented in Agile Web Development with Rails (AWDwR). I am using InstantRails for the server. In my app I have the folowing controllers: admin_controller application_controller city_map_controller (with method: displayGMap) The admin_controller was created with the following command: ruby script/generate scaffold Gmap Admin so that I could easily create records in the gmaps table (created with this code): DROP TABLE IF EXISTS `gmaps`; CREATE TABLE `gmaps` ( `id` int(11) NOT NULL auto_increment, `type` tinyint(4) NOT NULL default ''0'', `description` varchar(100) collate latin1_general_cs NOT NULL default '''', `lat` float NOT NULL default ''0'', `lon` float NOT NULL default ''0'', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_general_cs COMMENT=''For storing certain geolocations'' AUTO_INCREMENT=6 ; In the Gmap model I have the following code: class Gmap < ActiveRecord::Base require ''pp'' validates_presence_of(:type) validates_inclusion_of(:type, :in => 0..4, :message => "should be a valid abcRealty Map type") def self.allMapPoints # Gmap.find(:all, # :order => "description asc") results = find_by_sql("select id, description from gmaps WHERE 1") pp results[0] pp(Gmap.columns_hash[''type'']) results end Note that I cannot get the ''find :all'' statement to work. It yields a failure: SyntaxError in City mapController#index (eval):1:in `compute_type'': compile error (eval):1: parse error, unexpected tINTEGER Object::0 ^ C:/INSTAN~1/ruby/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/base.rb:1244:in `compute_type'' If I switch to my debug statements, when I do reference the ''type'' field in the ''find_by_sql'' statement I get an identical error. If I don''t reference the ''type'' field in the ''find_by_sql'' statement I get the following on the application console (running WEBrick): => Booting WEBrick... => Rails application started on http://0.0.0.0:3000 => Ctrl-C to shutdown server; call with --help for options #<Gmap:0x38b31a8 @attributes={"id"=>"1", "description"=>"City: Palo Alto, CA"}> #<ActiveRecord::ConnectionAdapters::MysqlColumn:0x38bee60 @default=0, @limit=4, @name="type", @null=false, @number=true, @primary=false, @sql_type="tinyint(4)", @text=false, @type=:integer> At first I thought I had corrupted something when I added the ''type'' column to the gmaps table using phpMyAdmin. (I also reran the scaffold generator to update that; recall my app is like the Depot app in AWDwR.) The only thing I have found so far to get this working is to rename the ''type'' column to something else. Then everything works fine. My question is this: why do I get this behavior when I name a table column ''type''? I am a newcomer to Ruby and Rails. Is there something I am missing?
Chuck Vose
2006-Jul-08 18:30 UTC
[Rails] Need Help Understanding Situation with Table Columns
On 7/8/06, johnmann@mannandassociatescpa.com <johnmann@mannandassociatescpa.com> wrote:> Note that I cannot get the ''find :all'' statement to work. It yields a failure: > > SyntaxError in City mapController#index > (eval):1:in `compute_type'': compile error > (eval):1: parse error, unexpected tINTEGER > Object::0 > ^There are two reasons for the type column being problematic: Object.type is a deprecated alias for Object.class and because of Single Table Inheretence where the type column is supposed to be the class of an object. STI is used when you want to have a staff table but to have Manager, Employee, etc. objects that all share mostly the same attributes. But it sounds like you found the solution, rename the column and it may fix everything. My thinking is that it''s trying to load an object called 0 (or 1,2,3, or 4) because that''s what''s in your type column. But it''s blowing its lid when it can''t find a model called 0. Thus the ugly error about compute_type, it can''t figure out which type to make the object it''s returning. Hope that helps a little bit, Chuck Vose