【问题标题】:Dynamically get Object's attribute动态获取Object的属性
【发布时间】:2012-02-28 11:54:23
【问题描述】:

如何动态获取 activerecord 对象的属性值?

例如,我有一个名为 attr_name 的变量。
我想做这样的事情:

person = Person.find(1)
attr_name = "address"
address = person.<function_name>(attr_name)

可以使用哪个function_name

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案1】:

    使用person.attributes[attr_name]person.read_attribute(att_name),甚至更短,即person[attr_name]

    【讨论】:

    • 这是最安全正确的方法。请注意,这仅适用于属性,不适用于其他方法或关联。
    • 无法使用object[symbol or string] 语法获取属性或方法。创建一个简单的类,并首先使用点语法使一些变量或方法可以公开访问以查看它是否有效,然后尝试通过符号或字符串访问它.. 无效。
    • ``` class Foo def 初始化 @foo = 'foo name' @bar = 'bar name' end def foo @foo end end foo = Foo.new foo[:foo] ```
    • @NickRes 仅是活动记录。
    【解决方案2】:

    send 是您正在寻找的方法。

    【讨论】:

    • 取决于函数名称的来源,这可能非常危险,所以我不会这样做
    • 如果您只是动态获取属性值,那么我肯定会使用[]attributes[]read_attribute 之类的东西。它更清晰,危险性更小。但是,要做真正动态的事情,你需要send
    【解决方案3】:

    如果这样做使用send

    address = person.send("function_name" + "attr_name")
    

    【讨论】:

    • 如果您只是动态获取属性值,那么我肯定会使用[]attributes[]read_attribute 之类的东西。它更清晰,危险性更小。但是,要做真正动态的事情,你需要send
    猜你喜欢
    • 2010-12-13
    • 1970-01-01
    • 2018-09-26
    • 2017-05-27
    • 2016-09-12
    • 2019-07-24
    • 2020-07-06
    • 2016-09-20
    • 1970-01-01
    相关资源
    最近更新 更多