We mainly use macros to create functions to deal with associations, a bit like ActiveRecord except that it is not yet as dynamic. We do not use the table meta data to find the associations and create the finders, etc... We want eventually to add stuff to clj-record to make it more like ActiveRecord in this regard. For now it's the urgency to deliver that is driving the schedule. We also maintain a cache within these functions to speed up things. The cache is not yet distributed again because of the schedule.
At least with these macros we are kind of half way toward the final goal.... Luc On Mon, 2009-09-14 at 14:34 -0700, Brenton wrote: > I am starting to write a large web application using Clojure and > Compojure and am running into some design trouble while designing my > data model. To illustrate my problem I am going to make up some fake > data. Suppose you are writing an Insurance application which has the > tables Policy, Person and Vehicle. A policy has a person that is the > policy holder. A policy also has many vehicles. Each vehicle has a > person that is the primary driver. Most of the time the primary driver > is the same as the policy holder. If I were using one of the usual > object-relational mapping frameworks, (Hibernate, ActiveRecord) when I > load a policy I would get an object graph. If the person who is the > policy holder is the same as the person who is the primary driver of > the vehicle then the loaded Person object would be the same object. If > I change the address of the policy holder the primary driver's address > will also be changed. > > How do people deal with this sort of thing in a Clojure application > (or any other functional language)? At first I thought that it would > be easy and I would just use nested maps. But this causes all kinds of > problems. If I load the data into nested maps I now have two distinct > maps for the same person. If I change one of them, the other is not > updated. If I try to save this map back to the database, which person > map has the correct data? It is also awkward to update the person in > the first place. In Java you would just go policy.getPolicyHolder > ().setAddress("..."). In Clojure you would have to do something like > (assoc policy :holder (assoc (:holder policy) :address "...")). > > I have a feeling that there is a more "functional" way to do this sort > of thing. My question is, how to other people deal with this? The only > thing that I can think of is that I would avoid using nested maps to > model the database associations. I would load the policy into a map. > Then if I need the person, I would load that into a separate map. That > may be the correct functional approach. I was just asking in case > there is some really cool thing that people do that I don't know > about. > > I had a look at clj-record to see how associations where handled. It > looks like nested maps are avoided here. Instead functions are created > to retrieve the associated data. Is the correct way of this this? > > Thank you, > Brenton > > > Luc Préfontaine Armageddon was yesterday, today we have a real problem... --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en -~----------~----~----~----~------~----~------~--~---