You could probably chain the threads together and have each thread call 
Thread#join on the Thread that was before it in the chain (after it has done 
the heavy work, of course).  That would mean each thread basically runs in 
parallel up until the end, at which point each waits the the previous one to 
complete.  I haven't tested it to see what the logic feels like.

Basically you can't really have something happen asynchronously and have 
synchronous behaviour at the same time… you will always have to make 
compromises somewhere.


On 09/11/2011, at 9:14 AM, Mateusz Wielgos wrote:

> Yeah, I could do that and did previously. It's just an overhead that
> shouldn't be there.
> 
> Thanks for the reply!
> 
> On Nov 8, 1:40 am, Chris Corbyn <[email protected]> wrote:
>> Can you just collect the objects into a generic data structure like an 
>> Array, then order them manually before actually associating them?
>> 
>> PS: I can't help but think that your model name "Query" is going to bite you 
>> at some point ;)  Model.query, and Collection#query are methods used by 
>> DataMapper, if you happen to have a "belongs_to :query" or a "has 1, :query" 
>> anywhere ;)
>> 
>> On 08/11/2011, at 3:00 PM, Mateusz Wielgos wrote:
>> 
>> 
>> 
>> 
>> 
>> 
>> 
>>> Hey guys,
>> 
>>> I have two models that are associated together with many-to-many
>>> relationship. The objects in this relationship are added
>>> asynchronously. There are multiple threads running that create and add
>>> objects.
>> 
>>> The problem that I have - I need to keep the order in which the
>>> objects are added.
>> 
>>> The two models that I have are:
>>> Query
>>> App
>> 
>>> A query can have many apps associated with it. An app can can also
>>> have many queries associated with it.
>> 
>>> In the code, I have something like:
>>> query.android_apps << app
>> 
>>> This works, but again, this is in it's own thread and I need to
>>> preserve the order.
>> 
>>> I tried changing this to:
>>> query.android_apps.insert(index,app)
>> 
>>> But when the query is saved I get an error stating:
>>> NoMethodError: undefined method `collection=' for nil:NilClass
>>>    from /usr/local/lib/ruby/gems/1.9.1/gems/dm-core-1.2.0/lib/dm-core/
>>> collection.rb:509:in `ensure in block in each'
>>>    from /usr/local/lib/ruby/gems/1.9.1/gems/dm-core-1.2.0/lib/dm-core/
>>> collection.rb:509:in `block in each'
>>>    from /usr/local/lib/ruby/gems/1.9.1/gems/dm-core-1.2.0/lib/dm-core/
>>> support/lazy_array.rb:411:in `block in each'
>>>    from /usr/local/lib/ruby/gems/1.9.1/gems/dm-core-1.2.0/lib/dm-core/
>>> support/lazy_array.rb:411:in `each'
>>>    from /usr/local/lib/ruby/gems/1.9.1/gems/dm-core-1.2.0/lib/dm-core/
>>> support/lazy_array.rb:411:in `each'
>>>    from /usr/local/lib/ruby/gems/1.9.1/gems/dm-core-1.2.0/lib/dm-core/
>>> collection.rb:504:in `each'
>>>    from /usr/local/lib/ruby/gems/1.9.1/gems/dm-core-1.2.0/lib/dm-core/
>>> collection.rb:1003:in `reject'
>>>    from /usr/local/lib/ruby/gems/1.9.1/gems/dm-core-1.2.0/lib/dm-core/
>>> collection.rb:1003:in `loaded_entries'
>>>    from /usr/local/lib/ruby/gems/1.9.1/gems/dm-core-1.2.0/lib/dm-core/
>>> associations/many_to_many.rb:444:in `_save'
>>>    from /usr/local/lib/ruby/gems/1.9.1/gems/dm-core-1.2.0/lib/dm-core/
>>> collection.rb:872:in `save'
>>>    from /usr/local/lib/ruby/gems/1.9.1/gems/dm-core-1.2.0/lib/dm-core/
>>> resource.rb:1054:in `block in save_children'
>>>    from /usr/local/lib/ruby/gems/1.9.1/gems/dm-core-1.2.0/lib/dm-core/
>>> resource.rb:1053:in `map'
>>>    from /usr/local/lib/ruby/gems/1.9.1/gems/dm-core-1.2.0/lib/dm-core/
>>> resource.rb:1053:in `save_children'
>>>    from /usr/local/lib/ruby/gems/1.9.1/gems/dm-core-1.2.0/lib/dm-core/
>>> resource.rb:1006:in `block in _save'
>>>    from /usr/local/lib/ruby/gems/1.9.1/gems/dm-core-1.2.0/lib/dm-core/
>>> resource.rb:1222:in `run_once'
>>>    from /usr/local/lib/ruby/gems/1.9.1/gems/dm-core-1.2.0/lib/dm-core/
>>> resource.rb:1005:in `_save'
>>>    from /usr/local/lib/ruby/gems/1.9.1/gems/dm-core-1.2.0/lib/dm-core/
>>> resource.rb:405:in `save'
>>>    from /usr/local/lib/ruby/gems/1.9.1/gems/dm-validations-1.2.0/lib/dm-
>>> validations.rb:40:in `block in save'
>>>    from /usr/local/lib/ruby/gems/1.9.1/gems/dm-validations-1.2.0/lib/dm-
>>> validations/context.rb:16:in `in_context'
>>>    from /usr/local/lib/ruby/gems/1.9.1/gems/dm-validations-1.2.0/lib/dm-
>>> validations.rb:40:in `save'
>>>    from /var/www/cgi/lib/models/store/store.rb:171:in `search'
>>>    from /var/www/cgi/lib/models/store/store.rb:102:in `search'
>>>    from (irb):7
>>>    from /usr/local/bin/irb:12:in `<main>'irb(main):008:0>
>> 
>>> I also tried specifying the relationships explicitly, like so:
>>> AndroidAppAndroidQuery.create(:android_query => query, :android_app =>
>>> query.android_apps[index])
>> 
>>> But this results with that same error. Changing insert method to [ ]
>>> results in that same error.
>> 
>>> Any suggestions on how I can overcome this in a proper way?
>> 
>>> Thanks!
>> 
>>> --
>>> You received this message because you are subscribed to the Google Groups 
>>> "DataMapper" group.
>>> To post to this group, send email to [email protected].
>>> To unsubscribe from this group, send email to 
>>> [email protected].
>>> For more options, visit this group 
>>> athttp://groups.google.com/group/datamapper?hl=en.
> 
> -- 
> You received this message because you are subscribed to the Google Groups 
> "DataMapper" group.
> To post to this group, send email to [email protected].
> To unsubscribe from this group, send email to 
> [email protected].
> For more options, visit this group at 
> http://groups.google.com/group/datamapper?hl=en.
> 

-- 
You received this message because you are subscribed to the Google Groups 
"DataMapper" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/datamapper?hl=en.

Reply via email to