Rails-like Model in D (making it "automagical")

Chris Miller lordSaurontheGreat at gmail.com
Sun Mar 23 23:31:13 PDT 2008


I've been throwing ideas around in my head for my pet project, ConYard (http://www.fsdev.net/wiki/conyard), and I'm not sure how to implement this in D.  I don't really know how to implement it in any language, so I thought I'd ask for some advice.

I want to create a model system similar to, though perhaps not necessarily as "automagical" as the models from Ruby on Rails.  I want a system that the programmer can extend to create a database-independent object that serializes to a database.  The problem I'm grappling with is how to make it so that the user doesn't have to hand-code everything, and can make the implementation more readable.

I'm not sure how to handle the model's fields.  I want the fields to be D types, eg. char[] and int and float and all that.  I also want for those types to serialize to the SQL database, without the user having to write all that nonsense by hand.

I need a way to somehow flag a field in a model as an element that needs to be serialized to a database.  From there it's fairly simple work of writing code that makes SQL statements based on input.  It's so simple, it scares me into over complicating it.

I'm not sure how to start about this.  I was thinking of some kind of static this () statement that the user has to fill in, and somehow "register" all the elements (that'll be in the database).  Then calls to functions that push/pull data to/from the database could call another function that the user doesn't have to touch, which takes all those elements from the model instance and generates the SQL queries (or uses a previously generated one) to make the data move.

It still seems like a lot of overhead to me, like a lot of boring stuff that the programmer has to type in all the time.  Imagine a library where you have to do something annoying like registerElement(IntElement(this.myfield)); in a static constructor all the time?  (IntElement would be some kind of element class that would know how to take a D int and make it to a SQL int, and then you could possibly write your own to take types that you make and translate them into SQL types, or serializations that fit into SQL types, etc).

There must be a better way.  I've scanned through the D 1.00 specification document a few times and come up dry.  If anyone has any suggestions of things I might try, or even examples of techniques that I could use, I'd really appreciate it!



More information about the Digitalmars-d mailing list