I found myself today trying to do this, and failing:

#!/usr/bin/env ruby
require 'rubygems'
require 'dm-core'

DataMapper.setup(:default, "sqlite3://#{Dir.pwd}/page.sqlite3")

class Page
  include DataMapper::Resource

  property :id,         Serial    # primary serial key
  property :body,       String    # cannot be null
  property :derived1,    String

  after :save, :after_save

  def after_save
      if attribute_get(:derived1).nil?
        attribute_set(:derived1,body.to_s + ".db")
        self.save
      end
  end
end
DataMapper.auto_migrate!
p = Page.new({ :body => "test123" })
p.save
p1 = Page.get(1)
puts p.inspect             # derived1 => body + .db
puts p1.inspect           # derived1 => nil

Initially, I was trying to make a field be a default of (item.id).to_s
+ "something", but this doesn't work with :default since attribute_get
isn't available to the class methods defining properties.  So I came
up with something equivalent to this, and fought it for a while.

I'm working around this now just fine--it was just a naive thing for
the first round of specs--but why does self.save not work in
after_save here?  If it's failing on purpose (which I can imagine,
given the risk of infinite recursion with poor programming), wouldn't
it be better to raise an exception than to silently, magically fail?
Perhaps at least not return true?

Thanks,
Ben
-- 
You received this message because you are subscribed to the Google Groups 
"DataMapper" group.
To post to this group, send email to datamap...@googlegroups.com.
To unsubscribe from this group, send email to 
datamapper+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/datamapper?hl=en.


Reply via email to