2016-09-03 142 views
0

在我的Ruby模型中,我想對我的Recipe上的某些屬性應用默認值。所以我增加了一個before_save回調應用它:這是我的食譜型號:類對象上的指針

class Recipe < ActiveRecord::Base 
    before_save :set_default_time 

    # other stuff 

    private 

    # set default time on t_baking, t_cooling, t_cooking, t_rest if not already set 
    def set_default_time 
     zero_time = Time.new 2000, 1 ,1,0,0,0 

     self.t_baking = zero_time unless self.t_baking.present? 
     self.t_cooling = zero_time unless self.t_cooling.present? 
     self.t_cooking = zero_time unless self.t_cooking.present? 
     self.t_rest  = zero_time unless self.t_rest.present? 
    end 

end 

這是相當的工作,但我想因式分解這樣的:

class Recipe < ActiveRecord::Base 
    before_save :set_default_time 

    # other stuff 

    private 

    # set default time on t_baking, t_cooling, t_cooking, t_rest if not already set 
    def set_default_time 
     zero_time = Time.new 2000, 1 ,1,0,0,0 

     [self.t_baking, self.t_cooling, self.t_cooking, self.t_rest].each{ |t_time| 
      t_time = zero_time unless t_time.present? 
     } 

    end 

end 

但它不工作。我怎樣才能循環對我的對象p​​ropertie「指針」?

回答

1

它不會工作,因爲您嚴格引用值,因此您的覆蓋不能按預期工作。你可以試試這個:

[:t_baking, :t_cooling, :t_cooking, :t_rest].each { |t_time| 
    self.send("#{t_time}=".to_sym, zero_time) unless self.send(t_time).present? 
} 
+0

非常感謝你,它完美的作品! – RousseauAlexandre

+0

不錯,一個小竅門是你可以跳過將方法名稱轉換爲符號,'.send'對字符串完美地工作。 – max

+0

是真實的,但據我所知,使用符號效率更高一些。問題是,如果你在應用程序的不同位置使用了符號':foobar',它們具有相同的'object_id',這對於字符串來說不是這樣(雙重內存分配) – djaszczurowski