在rails中,默认的getter和setter会是什么样子?

jay*_*jay 24 ruby ruby-on-rails virtual-attribute attr-accessor ruby-on-rails-3

我知道我可以编写attr_accessor:tag_list来为Rails中的对象创建一个虚拟属性tag_list.这允许在对象的表单中存在tag_list属性.

如果我使用attr_accessor:tag_list,我可以在模型中对tag_list执行操作以从表单中提取和操作数据.

我想知道的是,而不是写attr_accessor,我怎么会写一个getter和setter,将完全复制的attr_accessor默认功能.例如:

def tag_list
    #what goes here
end
Run Code Online (Sandbox Code Playgroud)

仅供参考我尝试过

 def tag_list
     @tag_list
 end
Run Code Online (Sandbox Code Playgroud)

这不起作用.

Nik*_* B. 66

attr_accessor是一个内置的Ruby方法,在ActiveRecord上下文中没有特殊含义.attr_accessor :tag_list基本上相当于这段代码:

# getter
def tag_list
  @tag_list
end

# setter
def tag_list=(val)
  @tag_list = val
end
Run Code Online (Sandbox Code Playgroud)

但是,在ActiveRecord模型中,可能需要这样的东西:

def tag_list
  self[:tag_list]
end

def tag_list=(val)
  self[:tag_list] = val
end
Run Code Online (Sandbox Code Playgroud)

有一点不同:使用第一种方法,obj[:tag_list]不使用与getter和setter相同的存储空间.对于后者,它确实如此.

getter/setter概念的解释

在Ruby中,以下两行代码是等效的

thing.blabla
thing.blabla()
Run Code Online (Sandbox Code Playgroud)

两者都调用blabla对象的方法thing并计算到该方法中计算的最后一个表达式.这意味着,你也不需要return声明在上面的getter方法的情况下,由于方法简单地返回该方法的最后一个表达式(@tag_list,实例变量的值).

此外,这两行代码是等效的:

thing.blabla=("abc")
thing.blabla = "abc"
Run Code Online (Sandbox Code Playgroud)

两者都调用blabla=对象的方法thing.与=任何其他方法名称一样,可以使用带有该字符的特殊名称.

事实上,属性(有时称为属性)实际上是普通方法,在返回或接受它们之前,您还可以使用一些特殊的逻辑转换为值.例:

def price_in_dollar
  @price_in_euro * 0.78597815
end

def price_in_dollar=(val)
  @price_in_euro = val / 0.78597815
end
Run Code Online (Sandbox Code Playgroud)


leo*_*ges 9

使用ActiveRecord时,这是等效的getter和setter版本:

def tag_list
  read_attribute(:tag_list)
end

def tag_list=(val)
  write_attribute(:tag_list, val)
end
Run Code Online (Sandbox Code Playgroud)

这是你在找什么?