Hello all,

Please help me get this working right in Rose,

CREATE TABLE a (
  id serial primary key,
  name text
);

CREATE TABLE b (
  id serial primary key,
  a_id integer,
  archived_at timestamp
  UNIQUE KEY (a_id, archived_at)
);

What I am trying to express here is that "a" is related to many "b"
records, by the a_id foreign key stored in the "b" table. I keep a
unique key on the "b" table that allows me to make a deterministic
one-to-one join for an "a" with it's current "b" record (the one that
is not archived).

So a call like this works to give me "a" and all related "b" records

SELECT * FROM a JOIN b ON (b.a_id=a.id)

And a call like this works to give me "a" with just it's current "b" record

SELECT * FROM a JOIN b ON (b.a_id=a.id) WHERE b.archived_at IS NULL

How should I model this in Rose to work properly?

Currently, I am creating the following relationships in A

  relationships =>
  [
    bs =>
    {
      type       => 'one to many',
      class      => 'My::B',
      column_map => { id => 'a_id' },
    },
    b =>
    {
      type        => 'one to one',
      class       => 'My::B',
      column_map  => { id => 'a_id' },
      manager_args=> { archived_at  => undef },
    },
]

Calling $a->b and $a->bs works as expected, but trying to update $a->b
with a new record simply overwrites the existing "b" record with new
data.

Am I modeling this wrong? How can I get Rose to archive the previous
$a->b when I say $a->b($new_b_record)? Or at least try to save the new
'b' record so that my DB will throw an error about a clashing unique
key?

-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
_______________________________________________
Rose-db-object mailing list
Rose-db-object@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/rose-db-object

Reply via email to