attr_accessor
是一个内置的 Ruby 方法,在上下文 ActiveRecord 中没有特殊含义。attr_accessor :tag_list
基本上相当于这段代码:
# getter
def tag_list
@tag_list
end
# setter
def tag_list=(val)
@tag_list = val
end
然而,在 ActiveRecord 模型中,您可能想要这样的东西:
def tag_list
self[:tag_list]
end
def tag_list=(val)
self[:tag_list] = val
end
有一点点不同:第一种方法obj[:tag_list]
不使用与 getter 和 setter 相同的存储空间。对于后者,它确实如此。
getter/setter 概念的解释
在 Ruby 中,下面两行代码是等价的
thing.blabla
thing.blabla()
两者都调用blabla
对象的方法thing
并计算在该方法中计算的最后一个表达式。这意味着,在上述 getter 方法的情况下,您也不需要return
语句,因为该方法只返回方法中的最后一个表达式(@tag_list
实例变量的值)。
此外,这两行代码是等效的:
thing.blabla=("abc")
thing.blabla = "abc"
两者都调用blabla=
对象的方法thing
。带有字符的特殊名称=
可以像任何其他方法名称一样使用。
有时称为属性的事实实际上是简单的方法,您还可以在返回或接受它们之前对值使用一些特殊的逻辑转换。例子:
def price_in_dollar
@price_in_euro * 0.78597815
end
def price_in_dollar=(val)
@price_in_euro = val / 0.78597815
end