当前位置:  开发笔记 > IOS > 正文

覆盖ActiveRecord属性方法

如何解决《覆盖ActiveRecord属性方法》经验,为你挑选了3个好方法。

我正在谈论的一个例子:

class Person < ActiveRecord::Base
  def name=(name)
    super(name.capitalize)
  end
  def name
    super().downcase  # not sure why you'd do this; this is just an example
  end
end

这似乎有效,但我刚刚阅读了ActiveRecord :: Base文档中覆盖属性方法的部分,并建议使用read_attributewrite_attribute方法.我认为在上面的例子中我所做的事情肯定有问题; 否则,为什么他们会将这些方法作为覆盖属性方法的"正确方法"?他们也在逼迫一个更丑陋的习语,所以必须有充分的理由......

我真正的问题是:这个例子有问题吗?



1> Aaron Longwe..:

回应Gareth的评论......你的代码将无法按照书面形式运作.它应该以这种方式重写:

def name=(name)
  write_attribute(:name, name.capitalize)
end

def name
  read_attribute(:name).downcase  # No test for nil?
end


这不再是真的.超级或现在都有效.但是,我没有测试哈希表示法.
在rails 3中,Aaron在这里指定的阅读器方法起作用,但是原始海报指定的作者(将名称提供给super)工作正常,并且哇哇比手工编写属性更干净,如Aaron建议的那样.

2> mipadi..:

作为Aaron Longwell答案的扩展,您还可以使用"哈希表示法"来访问具有被覆盖的访问器和更改器的属性:

def name=(name)
  self[:name] = name.capitalize
end

def name
  self[:name].downcase
end



3> jcnnghm..:

有关此主题的一些很好的信息,请访问http://errtheblog.com/posts/18-accessor-missing.

它的长短是ActiveRecord正确处理ActiveRecord属性访问器的超级调用.

推荐阅读
围脖上的博博_771
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有