Rails ActiveRecord supports partial updates, and it works well in most cases, but if we have a serialized hash field, AR will update every time, even if nothing has changed. Here is an example from the rails console:
### Create class and table ### >> class Xx < ActiveRecord::Base; serialize :params; end => Object >> ActiveRecord::Base.connection.execute "CREATE TABLE xxes(id serial, params text)" SQL (43.8ms) CREATE TABLE xxes(id serial, params text) => #<PGresult:0x112113380> ### Create record ### >> r = Xx.create(:params => {:a => 1}) SQL (0.9ms) INSERT INTO "xxes" ("params") VALUES ('--- :a: 1 ') RETURNING "id" => #<Xx id: 1, params: {:a=>1}> ### Find this record ### >> x = Xx.find(1) Xx Load (2.5ms) SELECT "xxes".* FROM "xxes" WHERE "xxes"."id" = 1 LIMIT 1 => #<Xx id: 1, params: {:a=>1}> ### Change nothing and call save ### >> x.save AREL (1.1ms) UPDATE "xxes" SET "params" = '--- :a: 1 ' WHERE "xxes"."id" = 1 => true
Is there a workaround?
source share