我有以下最小的DataMapper模型示例:
# model.rb
require 'data_mapper'
class Job
include DataMapper::Resource
after :create, :create_id_based_data
property :id, Serial
property :magicNumber, String
def create_id_based_data
self.magicNumber = "#{self.id}_#{Random.rand()}"
self.save!
end
end
DataMapper.setup(:default, 'sqlite::memory:')
DataMapper.auto_migrate!
如果我在irb中运行代码," magicNumber"未保存到数据库:
irb -r ./model.rb
2.2.1 :001 > Job.all
=> []
2.2.1 :002 > Job.create
=> #<Job @id=1 @magicNumber="1_0.6245356525078689">
2.2.1 :003 > Job.all
=> [#<Job @id=1 @magicNumber=nil>]
我的理解是,DataMapper会阻止save
回调中的重复save
来电,但不应该save
允许create
来调用save
挂钩后?即使不允许正常save!
来电,checked
来电也不应绕过所有回调,因此是允许的吗?
答案 0 :(得分:1)
查看this bug report,似乎阻止run_once
次呼叫循环的机制(save
)仍在使用中。不清楚这是不是一个bug。使用save_self
可以提供您想要的行为,代价是使用半公共API。
# model.rb
require 'data_mapper'
class Job
include DataMapper::Resource
after :create, :create_id_based_data
property :id, Serial
property :magicNumber, String
def create_id_based_data
self.magicNumber = "#{self.id}_#{Random.rand()}"
save_self(false)
end
end
DataMapper.setup(:default, 'sqlite::memory:')
DataMapper.auto_migrate!
结果:
irb -r ./model.rb
2.1.0 :001 > Job.all
=> []
2.1.0 :002 > Job.create
=> #<Job @id=1 @magicNumber="1_0.7816860975338344">
2.1.0 :003 > Job.all
=> [#<Job @id=1 @magicNumber="1_0.7816860975338344">]
2.1.0 :004 >