Hi Sabine, 

Sadly there is no automatic solution for your problem. 
I managed to resolve that by hacking the mongo description this way:

Trip class>> isVoyageRoot = true

Day class>> isVoyageRoot = false

VehicleTrip class>> isVoyageRoot = false

Now, the trick is that since the document will be something like: 


Trip {
        days {
                Day {
                        VehicleTrip { ...  day}
                        VehicleTrip { ...  day}
                }
        }
}

(that's of course, pseudo coding heavily ;) )

Actually, since all VehicleTrips will be part of Day subdocument, you do not 
need to store them. 
What you really need is to have the back-reference when you reconstruct the 
document 

You can achieve that by declaring transient the #day attribute of VehicleTrip 
and setting the day back when you read Day from the database:

VehicleTrip class>>mongoDay 
        <mongoDescription>

        ^ VOMongoTransientDescription new 
                attributeName: 'day';
                yourself


Day class>>mongoVehicleTrips 
        <mongoDescription>

        ^VOMongoToManyDescription new 
                 attributeName: 'vehicleTrips'; 
                accessor: (MAPluggableAccessor 
                         read: [ :day | day vehicleTrips ] 
                        write: [ :day :trips | 
                                trips do: [ :each | each day: day ].
                                day vehicleTrips: trips  ]); 
                 yourself

I think that will solve your embedded-cyclic problem. 

yes... it is a bit hacky, but it works perfectly :)

Cheers, 
Esteban


On Aug 12, 2013, at 11:33 AM, Sabine Knöfel <sabine.knoe...@gmail.com> wrote:

> Hi Esteban,
> 
> thank you for the solution with the VOMongoToOneDescription.
> This works perfect for me.
> 
> I have to come back to the circular references.
> I am not sure if this is a bug.
> 
> I have the following model:
> 
> Trip ->> Day <->> VehicleTrip
> 
> One Trip has N Days.
> One Day has N VehicleTrips.
> The VehicleTrip points back to its Day.
> The Trip is voyageRoot.
> 
> But I dont want Day or VehicleTrip to be voyageRoot, too.
> (In my opinion this does not make sense).
> 
> If I try to save the trip, I get the endless loop.
> Attention, the Image freezes then. :-)
> 
> How would you solve this? Also with the VOMongoToOneDescription solution?
> You can reproduce it with the fileout below.
> 
> Regards
> Sabine
> 
> This is the fileout:
> 
> Object subclass: #Day
>       instanceVariableNames: 'date vehicleTrips'
>       classVariableNames: ''
>       poolDictionaries: ''
>       category: 'RKA24-Demo'!
> 
> !Day methodsFor: 'accessing' stamp: 'sabineknoefel 8/12/2013 11:13'!
> date: anObject
>       
>       date := anObject! !
> 
> !Day methodsFor: 'accessing' stamp: 'sabineknoefel 8/12/2013 11:15'!
> vehicleTrips: anObject
>       
>       vehicleTrips := anObject! !
> 
> 
> Object subclass: #VehicleTrip
>       instanceVariableNames: 'day description'
>       classVariableNames: ''
>       poolDictionaries: ''
>       category: 'RKA24-Demo'!
> 
> !VehicleTrip methodsFor: 'accessing' stamp: 'sabineknoefel 8/12/2013 11:13'!
> day: anObject
>       
>       day := anObject! !
> 
> !VehicleTrip methodsFor: 'accessing' stamp: 'sabineknoefel 8/12/2013 11:14'!
> description: anObject
>       
>       description := anObject! !
> 
> 
> Object subclass: #Trip
>       instanceVariableNames: 'days description'
>       classVariableNames: ''
>       poolDictionaries: ''
>       category: 'RKA24-Demo'!
> 
> !Trip methodsFor: 'accessing' stamp: 'sabineknoefel 8/12/2013 11:14'!
> days: anObject
>       
>       days := anObject! !
> 
> !Trip methodsFor: 'accessing' stamp: 'sabineknoefel 8/12/2013 10:12'!
> description: anObject
>       
>       description := anObject! !
> 
> "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!
> 
> Trip class
>       instanceVariableNames: ''!
> 
> !Trip class methodsFor: 'as yet unclassified' stamp: 'sabineknoefel
> 8/12/2013 11:15'!
> demo
>       |theTrip theDay theVehicleTrip|
>       theTrip := Trip new description: 'Trip to Munic'.
>       theDay := Day new date: Date today.
>       theVehicleTrip := VehicleTrip new description: 'with car to fair'.
>       theVehicleTrip day: theDay.
>       theTrip days: (OrderedCollection with: theDay).
>       theDay vehicleTrips: (OrderedCollection with: theVehicleTrip ).
>        
>       theTrip halt save ! !
> 
> !Trip class methodsFor: 'as yet unclassified' stamp: 'sabineknoefel
> 8/12/2013 09:47'!
> isVoyageRoot 
>       ^true! !
> 
> 
> 
> 
> 
>       |theTrip theDay theVehicleTrip|
>       theTrip := Trip new description: 'Trip to Munic'.
>       theDay := Day new date: Date today.
>       theVehicleTrip := VehicleTrip new description: 'with car to fair'.
>       theVehicleTrip day: theDay.
>       theTrip days: (OrderedCollection with: theDay).
>       theDay vehicleTrips: (OrderedCollection with: theVehicleTrip ).
>        
>       theTrip inspect 
> 
> 
> 
> --
> View this message in context: 
> http://forum.world.st/Voyage-Circular-references-tp4691940p4703303.html
> Sent from the Pharo Smalltalk Users mailing list archive at Nabble.com.
> 


Reply via email to