Primary_key / legacy db

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

Relevant db structure;

mysql> 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 (
idint(4) NOT NULL, .....incidint(11) NOT NULL auto_increment, PRIMARY KEY (id,type,seq,incid), UNIQUE KEYincid(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

mysql> 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

On Jun 30, 2009, at 10:29 AM, dan wrote:

| 2 | 57 | 25 |
UNIQUE KEY incid (incid)
set_primary_key :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:

console> 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 B. http://agileconsultingllc.com
[email protected]