2014-10-30 39 views
0

我正在使用after_find回調來在執行/選擇用戶表之後使手機非規範化。rails跳過特定方法的after_find回調

after_find :denormalize_phone 

def denormalize_phone 
    self.phone = "....." 
end 

我試圖創建一個如下所示的動態方法時出現問題。我想跳過此特定塊的after_find回調。誰能幫我?

User.order(:state).map(&:state).uniq.each do |state| 
    define_singleton_method("is_#{state}_for") do |r| 
    .... 
    end 
end 

TX

+0

你是指'denormalizing'手機是什麼意思? 也許你應該在插入時做'非規範化',你可以使用這個gem,https://github.com/mdeering/attribute_normalizer – cthulhu 2014-10-31 01:16:28

+0

是的,它是有效的,適合這個。 – 2014-10-31 04:32:01

+0

如果我將它作爲答案發布,你會接受嗎? – cthulhu 2014-10-31 13:18:28

回答

1

不要使用after_find這一點。說真的,我找不到任何理由使用after_find。以下是您的選項(從最好到最差的IMO排序):

  1. 爲您的User對象使用裝飾器對象。裝飾器用於分組模型的表示邏輯。你可以自己實現它(不那麼難),或者這是一個gem讓你開始。
  2. 使用助手方法。像format_phone(@user.phone)。當然,不利的一面是你必須到處打電話給幫手。
  3. 在用戶模型中覆蓋phone方法。要獲得它的數據庫值,你可以使用self [:phone]。儘管您將表示邏輯放在數據層中,但這有點麻煩。
+0

使用'after_find'可能是錯誤的地方。但是,這在場景中非常有用;在每次查找後,將新的動態屬性enabled = true/false附加到用戶對象。 你的第二點是有效的。但是,@ cthulhu的建議非常適合這種情況。 Thx爲您的評論。 – 2014-10-31 04:26:51