Le 2011-03-29 à 16:03, Andrew Kinnie a écrit :

> Thanks for the tip on using create that way.  I didn't know you could do 
> that.  In any event, that's the problem.  NoteType is basically a lookup 
> table.  I would want to fetch an existing noteType based on some unique 
> attribute, such as "typeName" (which ensure is unique in the EO class)  I 
> don't want to create a new noteType, I want to create the intervening object 
> (DeviceNoteType) which has a to-one to NoteType and a to-one to Device.  AND 
> (here's the tough part - for me at least) I want to only create a new one if 
> one doesn't already exist.  So I need to fetch first, and I want to fetch 
> based on the value passed in for the name key

So you will do:

  new ERXRoute(NoteType.ENTITY_NAME, "/NoteType/{name:String}", 
ERXRoute.Method.Get, NoteTypesController.class, "fetchByName");

  public WOActionResults fetchByNameAction() {
    String typeName = routeObjectForKey("name");
    NoteType type = NoteType.fetchNoteType(editingContext(), 
User.NAME.eq(typeName));
    return response(type, yourerxkeyfilter());
  }

If fetchByNameAction didn't find an object, ERRest will return the HTTP code 
404, so your client can know that the object was not found, and call:

  new ERXRoute(NoteType.ENTITY_NAME, "/NoteType/", ERXRoute.Method.Post, 
NoteTypesController.class, "create");  // If you called addDefaultRoutes for 
the NoteType entity, that route already exist)

  public WOActionResults createAction() {
    NoteType type = create(NoteType.ENTITY_NAME, yourerxkeyfilter());
    editingContext().saveChanges();
    return response(type, yourerxkeyfilter());
  }

If you get a response with HTTP code in the 20x range, the object was created 
and now you can create your DeviceNoteType with a route like this:

  new ERXRoute(DeviceNoteType.ENTITY_NAME, "/DeviceNoteType", 
ERXRoute.Method.Post, DeviceNoteTypesController.class, "create");

When you call POST /cgi-bin/WebObjects/MyApp.woa/ra/DeviceNoteType, you will 
have to pass the a Device and a NoteType object in JSON as the body of the 
request.

I feel like I'm writing my WOWODC session in real-time :-P

> So I need to fetch on the passed in value from the json, get the correct 
> NoteType at the other end of the many to many, check if there is an existing 
> row in the join table for the device and noteType, and create a new one, only 
> if the intervening object doesn't exist. If it does exist, I set it's status 
> to active and return that, otherwise, I return the new one.
> 
> That's my theory at least.
> 
> 
> 
> On Mar 29, 2011, at 3:47 PM, Pascal Robert wrote:
> 
>> 
>> Le 2011-03-29 à 15:31, Andrew Kinnie a écrit :
>> 
>>> Well, first I tried to simply create the intervening object manually, but 
>>> then I realized I wanted to know if such an object already existed, so I 
>>> was going to do a fetch, but as random client wouldn't know the primary key 
>>> of the NoteType, I am not sure how to do that.  I could expose the primary 
>>> key, but I'd much rather not.
>>> 
>>> Presumably, the client could simple call the curl commands to create the 
>>> intervening object, then add the current object with a second line, but I 
>>> wanted to be able to do this in the java itself so the client could do 
>>> something like:
>>> 
>>> curl -X PUT -d "{noteType:{type:'NoteType', name:'Alert'}}" 
>>> http://My-MacBook-Pro.local:9001/cgi-bin/WebObjects/MyApp.woa/ra/Device/1/addNoteType.json
>>> 
>>> Then I would get the device, get the NoteType represented by the 
>>> routeObjectForKey("noteType") and set add the noteType to the relationship.
>>> 
>>>     public WOActionResults addNoteTypeAction() {
>>>             Device device = Device();
>>>             NoteType type = routeObjectForKey("noteType");
>>>             // set the relationships and do whatever else
>>>     ...
>> 
>> If you want to create a new NoteType to a Device, you should call the 
>> create() method in addNoteTypeAction instead of routeObjectForKey, and set 
>> the relation between the NoteType and the Device:
>> 
>> public WOActionResults addNodeTypeAction() {
>>  NoteType nodeType = create(NoteType.ENTITY_NAME, yourerxkeyfilter);
>>  Device device = routeObjectForKey("device");
>>  // set the relationship and call ec.saveObjects();
>> return response(nodeType, yourerxkeyfilter);
>> }
>> 
>> And your route:
>> 
>> requestHandler.addRoute(new ERXRoute(Device.ENTITY_NAME, 
>> "/Device/{device:Device}/addNoteType", ERXRoute.Method.Put, 
>> DevicesController.class, "addNoteType"));
>> 
>> This is untested, of course.

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

This email sent to [email protected]

Reply via email to