Rails ActiveRecord support partial updates and it works well most of the time, but in case we have serialized hash field AR executes update every time, even if nothing has been changed. Here example from 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 ###
>开发者_如何学JAVA> 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
Are there any workaround?
x.save if x.changed?
http://ar.rubyonrails.org/classes/ActiveRecord/Dirty.html
精彩评论