AirDB Join Table Attributes
In some cases, it becomes necessary to have additional attributes associated with a many-many relationship.
This is typically true of "has_and_belongs_to_many" associations which end up mirroring some kind of "membership" between the joined models. For example, a library system might track borrowing of books by patrons, with extra attributes for return dates and accrued fines.
The Django guys have a handy example about musicians and bands with extra attributes such as the membership role and date of joining. In my case, I needed to track sharing status of Photos across Photosets.
AirDB now has support for such join table attributes. Its a bit of a hack, in the interests of time, code size and abstraction concessions. The new things, which make it all possible include:
Setting the sharing status for a particular photo in this photoset
If no target is specified, the specified attributes are set for all associated photos in this photoset.
Count the number of photos based on some attribute.
Ideally, and with some coding leisure, this would be best done as a new has_many_through association. If you know of ActionScript language mechanisms to ease the implementation, I would be interested in hearing about them.
Meanwhile, we have functional join tables attributes.
- An optional argument to Migrator.joinTable()
- DB.execute(sql) to allow tweaking an existing join table.
- Associator methods: setAttr, findAllByAttr, countByAttr, getAttrVal.
// The new migration directive
function(my:Migrator):void {
var statusCol:Array = ['status', DB.Field.VarChar, {
limit: 4, 'default': Photo.ShareStatus.None}
];
DB.execute(
"ALTER TABLE photos_photosets ADD COLUMN " +
DB.fieldMap(statusCol)
)
}public function photoSent(photo:Photo):void {
this.photos.setAttr({status: Photo.ShareStatus.Sent}, photo);
}this.photos.setAttr({status: Photo.ShareStatus.Sent});var xfrCond:String = "status = '" + Photo.ShareStatus.Sent; this.photos.countByAttr(xfrCond);