NOOB - Problem with list view and foreign keys

Hello Group,

Ruby/Rails noob coming from PHP land please excuse the simple
question…

BACKGROUND:

I have 2 tables ‘assets’ & ‘types’ (well, I have more, but for the
sake of simplicity…):

CREATE TABLE assets (
id int(11) NOT NULL auto_increment,
type_id int(11) NOT NULL,
… [snip] …
PRIMARY KEY (id),
KEY fk_asset_type (type_id),
… [snip] …
CONSTRAINT fk_asset_type FOREIGN KEY (type_id) REFERENCES
types (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT=‘Asset Records’;

CREATE TABLE types (
id int(11) NOT NULL auto_increment,
typename varchar(20) NOT NULL default ‘’,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT=‘Asset Type
Definitions’;

Here are my model definitions for the two tables:

class Asset < ActiveRecord::Base
set_table_name “assets”
set_primary_key “id”
has_one :type, :class_name=>“Type”, :foreign_key=>“type_id”
end

class Type < ActiveRecord::Base
set_table_name “types”
set_primary_key “id”
belongs_to :asset, :class_name=>“Asset”
end

And finally my controller for assets:

class AssetsController < ApplicationController
… [snip] …
def list
@asset_pages, @assets = paginate :assets, :per_page => 20
@type = Type.find(:all)
end
… [snip] …
end

In my ‘list’ view for assets, this works:

<% for asset in @assets %>


<%= asset.type_id %>
<% end %>

However, I only get the integer value returned.

ISSUE:

The following modification fails:

<% for asset in @assets %>


<%= asset.type.typename %>
<% end %>

With Error:

Mysql::Error: Unknown column ‘types.type_id’ in ‘where clause’:
SELECT * FROM types WHERE (types.type_id = 1) LIMIT 1

I am confused as to why Rails is constructing the query for the Types
table assuming the primary key is ‘type_id’ when I specify the PK as
‘id’ in the Types model…

Can anyone set me straight?

TIA.

  • Brian

SELECT * FROM types WHERE (types.type_id = 1) LIMIT 1

This is looking for a table called “types” with a column “type_id”.

I think the offending line is:

has_one :type, :class_name=>“Type”, :foreign_key=>“type_id”

You just need:
has_one :type

end

You can simplify these by taking advantage of the rails naming
convention, e.g.

class Asset < ActiveRecord::Base
has_one :type
end

Thanks for the response. I implemented the suggested simplifications
& now get:

Mysql::Error: Unknown column ‘types.asset_id’ in ‘where clause’:
SELECT * FROM types WHERE (types.asset_id = 1) LIMIT 1

Now, I am confused as to why rails is looking for ‘types.asset_id’.

Very strange, maybe I need to go back to the drawing board…

  • Brian