通过引用更新属性

时间:2012-05-16 01:28:11

标签: ruby-on-rails ruby ruby-on-rails-3

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

对象用户具有属性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 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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

网页模型

alias_attribute:position,:pages_position

主题模型

alias_attribute:position,:subjects_position

部分模型

alias_attribute:position,:section_position

对每个模型使用(Model.position = values)。希望能解决你的问题。

答案 2 :(得分:0)

您还可以使用send docs并使用符号或字符串来引用属性的方法。 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"

答案 3 :(得分:0)

查看githubupdate_attribute模块中ActiveRecord::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问道。