Keenan Brock
2014-Jan-06  04:46 UTC
Idea for handling dirty active_record serialized columns
Hello All,
Currently, `serialized` columns get save to the database whether they are 
changed or not. [Github][1]. Since the serialized columns can be modified 
inline, `Dirty` is not used. This behavior introduces too much database 
overhead for us, so I'd like to patch that code right out of there.
## Having trouble extending ActiveRecord
`ActiveRecord::Base.ancestors` returns `ActiveRecord::Core` before 
`ActiveRecord::AttributeMethods::Dirty`, so the methods in `Core` take 
precedence over those in `Dirty`.
I was thinking `Dirty` overrides the behavior of `Core` and should have 
higher precedence. This would allow `@changed_attribtues` to move from 
`Core` to `Dirty`.
Is there history to this decision? Or is it even possible to change this? 
(I mean from both technically, as well as logistically changing something 
so core to the code.)
## Changing the way `Dirty` is implemented.
I played around with storing the original values for an attribute, rather 
than just the values that have been changed. [Github][2] Only 
cloning/storing `@original_values` on attribute access keeps the code as 
close to the current `@changed_attributes` implementation. It not only 
works with serialized variables, but code like 
`model.field.gsub!('a','b')`, without requiring
`field_will_change!`
It was more of a whim, but I wanted to know what people thought.
## A more practical solution
I did a more traditional suggestion for a fix. [Github][3] But something in 
me is starting to like changing the way `Dirty` works, even thought it 
seems a bit much.
Any direction would be appreciated.
Thanks for all the hard work on rails,
kbrock
[1]: https://github.com/rails/rails/issues/8328
[2]: https://github.com/rails/rails/pull/13606
[3]: https://github.com/rails/rails/pull/13428
-- 
You received this message because you are subscribed to the Google Groups
"Ruby on Rails: Core" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to rubyonrails-core+unsubscribe@googlegroups.com.
To post to this group, send email to rubyonrails-core@googlegroups.com.
Visit this group at http://groups.google.com/group/rubyonrails-core.
For more options, visit https://groups.google.com/groups/opt_out.