DataMapper で Lazy loading していると UPDATE 文が実行されない
なんか DataMapper (0.9.7) でいやらしいバグに遭遇してしまった。
モデルオブジェクトを変更して save() を呼んでも、UPDATE 文が実行されない。
いろいろ試したところ、どうも lazy loading になっていると、UPDATE 文が実行されないようだ。
再現手順:
まず lazy loading が有効になっているモデルオブジェクトを定義する。
$ merb-gen model post $ vi app/models/post.rb $ cat app/models/post.rb class Post include DataMapper::Resource property :id, Serial property :title, String, :nullable => false, :length => 255 property :body, Text, :nullable => false # Text なので lazy loading end $ rake db:autoupgrade
次に、モデルオブジェクトを作成し、値を変更してみる。
$ merb -i >> Post.create(:title=>"Title1", :body=>"Body1") Thu, 27 Nov 2008 01:46:22 GMT ~ debug ~ INSERT INTO `posts`(`body`, `title`) VALUES ('Body1', 'Title1') => #<Post id=1 title="Title1" body="Body1"> >> post1 = Post.get(1) Thu, 27 Nov 2008 01:47:00 GMT ~ debug ~ SELECT `id`, `title` FROM `posts` WHERE (`id` = 1) ORDER BY `id` LIMIT 1 => #<Post id=1 title="Title1" body=<not loaded>> >> post.title = "XXX" ## タイトルを変更してみる => "XXX" >> post1.save ## けど UPDATE 文が実行されない Thu, 27 Nov 2008 01:48:03 GMT ~ debug ~ SELECT `body`, `id`, `title` FROM `posts` WHERE (`id` = 1) ORDER BY `id` => true >> post1.title ## もちろん変更はキャンセルされている => "Title1"
今のところ、解決策としてはプロパティ定義に「:lazy => false」をつけるしかなさそう。
class Post include DataMapper::Resource property :id, Serial property :title, String, :nullable => false, :length => 255 property :body, Text, :nullable => false, :lazy => false end
〔追記(2008-12-10): DataMapper 0.9.8 で修正された模様〕