F. Oliver Gathmann wrote: > > On 11/12/09 1:00 PM, Tim Hoffman wrote: >> Hi >> >> I have done some fairly extensive projects using traversal over a >> relational model and we did use intermediate container classes alot. >> Mainly because each major entity could have about 6 different classes >> of sub items that we needed to group into containers anyway >> >> I reverse engineered the entire relational model from the existing >> database and then autogenerated all of the intermediate classes. >> Quite easy to do. I was using storm as an orm over the top, which >> made things a lot easier > Hmm... still, this feels like an artifact to me. Presumably, in most > cases what you want to return when the URL asks for a collection of > sub-items is the very collection you already defined in your ORM on the > model object that is the current context (we are using SQLAlchemy, BTW). > I cannot help but think that there should be a way to automatically > return an adapted collection that supports further traversal if > necessary... but I'm not sure of all the ramifications of that idea.
I suspect there should be a pattern for this. This pattern might be a good one, though I don't know to what extent it can be generalized: class TraversableCollection(object): def __init__(self, parent, name, collection): self.__parent__ = parent self.__name__ = name self.collection = collection def __getitem__(self, name): return getattr(self.collection, name) # or whatever the API is class Cars(object): def __getitem__(self, name): collection = get_collection(model, name) # some helper thing return TraversableCollection(self, name, collection) Might be generalizable via a subclass: class Collection(object): def __getitem__(self, name): collection = get_collection(model, name) # some helper thing return self.collection_class(self, name, collection) class Cars(Collection): collection_class = TraversableCollection Or via Zope-style adaptation. - C _______________________________________________ Repoze-dev mailing list Repoze-dev@lists.repoze.org http://lists.repoze.org/listinfo/repoze-dev