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 で修正された模様〕