1

Rails ActiveRecord は部分的な更新をサポートしており、ほとんどの場合うまく機能しますが、ハッシュ フィールドをシリアライズした場合、AR は何も変更されていなくても毎回更新を実行します。Rails コンソールの例:

### 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 

回避策はありますか?

4

1 に答える 1

1

x.save if x.changed?

http://ar.rubyonrails.org/classes/ActiveRecord/Dirty.html

于 2011-09-16T17:12:56.003 に答える