1

我想知道是否可以引用对象的属性。

对象 User 有属性first_name,所以通常如果我们想更新名字属性,我们会这样做:

user0 = User.new()
user0.update_attribute(:first_name, "joe")

现在我的问题是我可以:first_name像这样通过另一个变量/符号更新属性:

user0.update_attribute(:fname_ref, "jack")
user0.first_name  #=> has the value jack

我一直在寻找像 Perl 中的变量引用,但在 Ruby 中一无所获。

- - - - - 编辑

我正在做 lynda ruby​​ on rails 教程,并且正在创建一个模块来调整表格中项目的位置。不幸的是,当我第一次开始时,我以不同的方式命名了我的表格列 pages.page_position, subjects.subject_position, sections.section_position

现在模块 PositionMover 将用于三个模型,所以现在我遇到了一个问题,因为每个模型的属性名称都不同

所以我想不用担心我会为每个模型创建一个指针/引用

:position = :pages_position , :position = :subjects_position , :position = :section_position

因此问题是,如果它甚至可能做到这一点。

如果不可能,任何建议我应该怎么做,所以该模块可以用于三个不同的模型,具有不同的属性名称。

对不起,我是新手。

4

4 回答 4

2

符号不像变量,它们实际上是一种对象类型,例如 String 或 Fixnum,因此您可以拥有一个符号类型的变量。

我认为这就是你要找的:

attribute = :first_name
user0.update_attribute(attribute, "jack")
user0.first_name  #=> has the value jack

更新:如果你有一个字符串并且需要转换为一个符号,(我不确定你是否需要这个update_attribute

foo = "string"
foo.to_sym #=> :string
于 2012-05-16T01:54:23.727 回答
1

使用alias_attribute。定义到每个模型中,如:

页面模型

别名属性:位置,:页面位置

主题模型

别名属性 :position , :subjects_position

剖面模型

别名属性 :position , :section_position

并将 (Model.position = values) 与每个模型一起使用。希望它可以解决您的问题。

于 2012-05-16T05:52:30.907 回答
0

请参阅githubupdate_attributeActiveRecord::Persistence模块中的定义:

def update_attribute(name, value)
  name = name.to_s
  verify_readonly_attribute(name)
  send("#{name}=", value)
  save(:validate => false)
end

这使我相信您可以将以下内容添加到您的模型中以实现该行为:

alias_method :fname_ref= :first_name=

我很想知道您为什么要按照@Andrew Marshall 的要求这样做。

于 2012-05-16T04:19:34.240 回答
0

您还可以使用send 文档并使用符号或字符串来引用属性的方法。send可能非常有用,因为它使您能够选择将在运行时调用的方法。

例如

user.first_name = "Jack" # set first_name to Jack
                         # Note: method "first_name=" (a settor) is being used    

attribute = "first_name"
user.send attribute + "=", "Jack" # set first_name to Jack
                                  # The string "first_name=" is coerced into
                                  # a symbol

attribute = :first_name
val = user.send attribute # => returns "Jack"
于 2012-05-16T02:10:16.107 回答