datamapper/dm-core

Arrays / Sets won't update properly

florian opened this issue · 3 comments

One of my models has a property that is a Set. (Same problem with arrays.)

property :some_set, Object

When I create an instance, the set is properly saved. But when I try to update the set (add a field to the set, and save the instance) the new set is not saved to the database.

instance = Model.first
instance.some_set #=> <Set: {"a", "b"}>

instance.some_set = instance.some_set.add('c')
instance.save()

instance.some_set #=> <Set: {"a", "b", "c"}>
Model.first.some_set #=> <Set: {"a", "b"}>

How to reproduce:

$ git clone https://github.com/js-coder/dm-sets.git
$ cd dm-sets
$ ruby set.rb
$ ruby array.rb
mbj commented

With objects mutated inplace dm1 is unable to detect dirtyness. A verbose answer can be found here: http://stackoverflow.com/questions/13917062/why-datamapper-does-not-update-records-detect-dirtiness. dm-types tries to workaround this with a dirty-minder, but this IMHO only does only fix the symptoms not the problem itself.

DataMapper 2.0 does not have this problem, by design.

So I'd include dm-types and use Flag for arrays? There's no type for a Set right?

I wonder if a quick fix would be to add the ability to explicitly mark something as dirty? I think I could add this feature. It's not ideal, but I think it's doable.