2015-09-06 24 views
1

我有以下的小例子,DataMapper的模式:爲什麼我不能稱self.save!在Ruby 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,但不應在create之後允許在save呼叫之後掛斷?即使正常的save呼叫是不允許的,是否不應該將save!呼叫繞過所有的回叫,因此是允許的?

+0

我正在運行的DataMapper V1.2.0 – winni2k

回答

1

看着this bug report,它出現了一種機制(run_once),它可以防止呼叫仍然在進行中的迴路save。不清楚這是否是一個錯誤。使用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 > 
+0

對不起,我想我是你的最後一句話困惑。你是否同意我的意見,或者你是否在說'save!'的行爲與人們預期的一樣? – winni2k

+0

我同意你的意見。我希望'創造'來改變它的數據存儲。我希望在回調中調用'save!'也應該改變數據存儲。我在github.com上向dm-sqlite-adpater輸入了一個問題,目前還沒有任何評論。 –

相關問題