2014-10-30 20 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