为什么我不能称之为self.save!在Ruby DataMapper里面:创建回调?

时间:2015-09-06 15:41:28

标签: ruby ruby-datamapper

我有以下最小的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来电也不应绕过所有回调,因此是允许的吗?

1 个答案:

答案 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 >