rsim / oracle-enhanced

Oracle enhaced adapter for ActiveRecord
MIT License
545 stars 307 forks source link

raw type should be able to deserialize #2268

Open akostadinov opened 2 years ago

akostadinov commented 2 years ago

ActiveRecord expects types to properly deserialize any values that have been serialized. Right now (Rails 7.1) by every object save the attributes are reset by serialize/deserialize cycle.

see ActiveModel::ActiveModel#forget_attribute_assignments

It might be inefficient but other parts of ActiveRecord and ActiveModel attributes also rely on serialize and deserialize being reversible. At least I saw that #changed_in_place? expects this to be true in some types like Serialized. So it is rather complicated to change Rails to prevent that.

And also it makes intuitive sense that if our class has #serialize and #deserialize methods, that they reverse each other.

So to avoid confusing errors now and going forward, I believe we need this change.

This is more of a hack but I'm not sure of a better way to fix. Provided that we can use #write_lobs for such inserts, then I don't know why we should serialize and insert with the insert statement thus need the #serialize? Related to #2226

I feel there should be a better fix but I'm confused with the whole idea around lob writing.

yahonda commented 2 years ago

Related to https://github.com/rails/rails/issues/44317

akostadinov commented 2 years ago

Basically if we always use #write_lobs perhaps we don't need to have a #serialize method and thus no fixing would be needed.

And if we believe that #write_lobs is necessary is some use cases, then this or another workaround would be needed. Or Rails to stop updating the attribute value unnecessarily.

akostadinov commented 1 year ago

@yahonda , I updated implementation and description of this PR. But now all tests fail for some issue with database_version that I don't think I have anything to do with that. Would you advise?

akostadinov commented 1 year ago

bump