147 oop activerecord ruby-on-rails
我正在谈论的一个例子:
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
Run Code Online (Sandbox Code Playgroud)
这似乎有效,但我刚刚阅读了ActiveRecord :: Base文档中覆盖属性方法的部分,并建议使用read_attribute和write_attribute方法.我认为在上面的例子中我所做的事情肯定有问题; 否则,为什么他们会将这些方法作为覆盖属性方法的"正确方法"?他们也在逼迫一个更丑陋的习语,所以必须有充分的理由......
我真正的问题是:这个例子有问题吗?
Aar*_*ell 210
回应Gareth的评论......你的代码将无法按照书面形式运作.它应该以这种方式重写:
def name=(name)
write_attribute(:name, name.capitalize)
end
def name
read_attribute(:name).downcase # No test for nil?
end
Run Code Online (Sandbox Code Playgroud)
mip*_*adi 91
作为Aaron Longwell答案的扩展,您还可以使用"哈希表示法"来访问具有被覆盖的访问器和更改器的属性:
def name=(name)
self[:name] = name.capitalize
end
def name
self[:name].downcase
end
Run Code Online (Sandbox Code Playgroud)
有关此主题的一些很好的信息,请访问http://errtheblog.com/posts/18-accessor-missing.
它的长短是ActiveRecord正确处理ActiveRecord属性访问器的超级调用.