在Rails中使用attr_accessor

时间:2010-05-08 05:56:04

标签: ruby-on-rails ruby

您何时在Rails模型中使用attr_reader / attr_writer / attr_accessor

5 个答案:

答案 0 :(得分:63)

从不,除非您有特殊需要。为您创建了自动数据库支持的访问者,因此您无需担心。

您创建的任何attr_accessor都将更改rails对象上的相关@attr,但是当对象被销毁时,这将丢失,除非您将其粘贴回数据库中。有时你确实想要这种行为,但这在rails应用程序中是不常见的。

现在在红宝石中,这是一个不同的故事,你最终经常使用它们。但是如果你需要它们在轨道上我会感到惊讶 - 特别是最初。

答案 1 :(得分:53)

attr_accessor可用于您不希望直接存储在数据库中的值,并且仅在对象的生命周期内存在(例如密码)。

attr_reader可以作为执行类似操作的几种替代方法之一:

def instance_value
  "my value"
end

答案 2 :(得分:12)

Rails模型只是继承自ActiveRecord::Base的ruby类。 ActiveRecord使用attr_accessor来定义引用ruby类表的列名的getter和setter。重要的是要注意这只是为了坚持;模型仍然只是红宝石类。

attr_accessor :foo只是以下内容的快捷方式:

def foo=(var)
  @foo = var
end

def foo
  @foo
end

attr_reader :foo只是以下内容的快捷方式:

def foo
  @foo
end

attr_writer :foo是以下内容的快捷方式:

def foo=(var)
  @foo = var
end

attr_accessor getter和setter 的快捷方式,而attr_reader getter 的快捷方式,而attr_writer是只有 setter 的快捷方式。

在rails中,ActiveRecord以方便的方式使用这些getter和setter来读取和写入数据库的值。但是,数据库只是持久层。您可以像使用任何其他ruby类一样自由地使用attr_accessorattr_reader来正确构建业务逻辑。由于您需要获取并设置对象的属性而不是需要持久保存到数据库,因此请相应地使用attr_

更多信息:

http://apidock.com/ruby/Module/attr_accessor

http://www.rubyist.net/~slagell/ruby/accessors.html

What is attr_accessor in Ruby?

答案 3 :(得分:1)

如果您使用它来验证terms_of_service的接受度,您应该考虑使用validates:terms_of_service,:acceptance =>真正。它将创建一个虚拟属性,并且更加简洁。

http://guides.rubyonrails.org/active_record_validations.html#acceptance

答案 4 :(得分:0)

一个例子是在一个序列化列中存储许多选项。如果您尝试为这些选项之一设置文本字段,表单构建器会抱怨。您可以使用attr_accessor伪造它,然后在更新操作中将其保存在序列化列中。