And to add to that, if it's not clear ......

- Use the same table (as you said  "near identical")
- If you like prefix the non-common attributes with underscore or sth, and 
write behavior interface cover methods that throw when the attribute is being 
set on the wrong type.
- Use type attribute for fetches to exclude user-customized templates.


On May 11, 2011, at 3:56 PM, Kieran Kelleher wrote:

> If I understood you correctly:
> 
> - Make option relationship from tUser <-->> tA for "user-owned templates"
> - Add extra fields to tA
> - Add a type field to tA - Integer - each int denotes a behavior
> - Use Strategy Design pattern and create 2 behavior classes that correspond 
> to two templates types
>       TemplateBehavior interface
>               DefaultTemplateBehavior
>               UserTemplateBehavior
> 
> - Methods/logic that differ between both template scenarios should be put in 
> the Behavior interface and implemented in Behavior classes.
> - The EO class corresponding to tA also implements TemplateBehavior interface.
> - Set default value of type to be DefaultTemplateBehavior type (say type = 10)
> - lazy instantiate behavior in the class based on value of type.
>       private TemplateBehavior _behavior;
> 
>       private TemplateBehavior behavior() {
>               if ( _behavior == null) {
>                       if (type().intValue() == 20) {
>                               _behavior = new UserTemplateBehavior(this);
>                       } else {
>                               _behavior = new DefaultTemplateBehavior(this);
>                       }
>               }
>               return _behavior;
> 
> - implement interface methods in the EO class like this
>       public void doSomething() {
>               behavior().doSomething();
>       }
> 
> - Use Chuck's EOCopyable interface and utilities to copy tA instance when a 
> user wants to customize.  Set your extra attrivutes and change the type of 
> the copied template to the int corresponding to the UserTemplateBehavior (and 
> reset _behavior to null - I have a reset() method in my GenericEO and is used 
> to nullify cached ivars on every didUpdate and didInsert btw)
> 
> HTH, Kieran
> 
> On May 11, 2011, at 3:14 PM, Michael Gargano wrote:
> 
>> I was just talking to David Holt about this and he suggested I tap the brain 
>> trust.  :)
>> 
>> I was wondering if there is a database design pattern for a situation where 
>> I have some template structure 
>> let's say
>> 
>>      tA <->> tB <->> tC  (records across these tables are the template, the 
>> template is a whole object graph rooted at one record in tA)
>> 
>> where the templates can be configured on a per tenant basis (so, the 
>> templates themselves are records that define defaults and new ones can be 
>> added when new tenants or templates are added).  I need to make a copy of a 
>> template that a tenant uses and make it local to a user (under that tenant) 
>> who can then customize the values in that template for their needs.
>> 
>> It's basically a class/instance kind of structure, but at the data level in 
>> the database.  It's as if I need to copy an EOs from one table to another 
>> where the destination table has a few more attributes than the source table 
>> did.  It's made more complicated by the fact that I need to copy that 
>> template object graph, not just one EO.
>> 
>> Any suggestions?
>> *Hopes beyond hope*
>> 
>> Thanks.
>> -Mike
>> 
>> _______________________________________________
>> Do not post admin requests to the list. They will be ignored.
>> Webobjects-dev mailing list      (Webobjects-dev@lists.apple.com)
>> Help/Unsubscribe/Update your Subscription:
>> http://lists.apple.com/mailman/options/webobjects-dev/kelleherk%40gmail.com
>> 
>> This email sent to kelleh...@gmail.com
> 

 _______________________________________________
Do not post admin requests to the list. They will be ignored.
Webobjects-dev mailing list      (Webobjects-dev@lists.apple.com)
Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/webobjects-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to