我想知道是否可以引用对象的属性。
对象用户具有属性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
因此问题,如果它甚至可能做到这一点。
如果不可能,任何建议我应该怎么做,所以模块可以 可以在三个不同的模型中使用,具有不同的属性名称。
抱歉,我是新手。答案 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)
查看github上update_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问道。