primary_key / legacy db

Hi, I am forced to use an old database with rails.

Relevant db structure;

Hi, I am forced to use an old database with rails.

Relevant db structure;

> select id,permission,incid from acl group by id; +----+------------+-------+ > id | permission | incid | +----+------------+-------+ > 1 | 58 | 1 | > 2 | 57 | 25 | > 3 | 57 | 32 | +----+------------+-------+

Show create table acl:

CREATE TABLE `acl` ( id` int(4) NOT NULL, ..... `incid` int(11) NOT NULL auto_increment, PRIMARY KEY (`id`,`type`,`seq`,`incid`), UNIQUE KEY `incid` (`incid`)

So the primary key that I want to use in place of id is "incid"

"id" contains some acl ids and is not auto increment (has multiple rows returned per one `id`).

My model looks like this:

class Acl < ActiveRecord::Base set_table_name :acl; set_primary_key :incid; def self.primary_key() 'incid'; end self.primary_key = 'incid'; set_inheritance_column :ruby_id; end

script/console

r = Acl.find(2); <-- that's checking for `incid`

?> r.id => 2

log: Acl Load (0.3ms) SELECT * FROM `acl` WHERE (`acl`.`incid` = 2)

script/console

r = Acl.find(31);

?> r.id => 31 Acl Load (0.3ms) SELECT * FROM `acl` WHERE (`acl`.`incid` = 31)

So, instead of r.id returning the value of the `id` field , it returns the value for the incid field.

For the second example it should have returned `2` instead of `31` which is actually the value of `incid`

> select id,permission,incid from acl where incid='31'; +----+------------+-------+ > id | permission | incid | +----+------------+-------+ > 2 | 57 | 31 | +----+------------+-------+

What should my model look like to be able to get the value of the `id` field?

Dan

See if you can get the field that you want with this syntax:

r=Acl.find(31); r[:id]

r.id will always be the primary key (as you've discovered), but r[:id] (or r['id'] if you prefer) will give you the 'id' attribute. (I recently had to refer to a column 'type' this way because ruby wants r.type to be the same as r.class, and r[:type] always returns the column.)

-Rob

Rob Biedenharn http://agileconsultingllc.com Rob@AgileConsultingLLC.com

Hi, I am forced to use an old database with rails.

Relevant db structure;

> select id,permission,incid from acl group by id; +----+------------+-------+ > id | permission | incid | +----+------------+-------+ > 1 | 58 | 1 | > 2 | 57 | 25 | > 3 | 57 | 32 | +----+------------+-------+

Show create table acl:

CREATE TABLE `acl` ( id` int(4) NOT NULL, ..... `incid` int(11) NOT NULL auto_increment, PRIMARY KEY (`id`,`type`,`seq`,`incid`), UNIQUE KEY `incid` (`incid`)

So the primary key that I want to use in place of id is "incid"

"id" contains some acl ids and is not auto increment (has multiple rows returned per one `id`).

My model looks like this:

class Acl < ActiveRecord::Base set_table_name :acl; set_primary_key :incid; def self.primary_key() 'incid'; end self.primary_key = 'incid'; set_inheritance_column :ruby_id; end

script/console>> r = Acl.find(2); <-- that's checking for `incid`

?> r.id => 2

log: Acl Load (0.3ms) SELECT * FROM `acl` WHERE (`acl`.`incid` = 2)

script/console>> r = Acl.find(31);

?> r.id => 31 Acl Load (0.3ms) SELECT * FROM `acl` WHERE (`acl`.`incid` = 31)

So, instead of r.id returning the value of the `id` field , it returns the value for the incid field.

For the second example it should have returned `2` instead of `31` which is actually the value of `incid`

> select id,permission,incid from acl where incid='31'; +----+------------+-------+ > id | permission | incid | +----+------------+-------+ > 2 | 57 | 31 | +----+------------+-------+

What should my model look like to be able to get the value of the `id` field?

Dan

just use model.attributes[:id] or model.read_attribute :id