【问题标题】:get model attribute dynamically in rails 3在rails 3中动态获取模型属性
【发布时间】:2011-05-13 18:54:26
【问题描述】:

如何从模型对象中动态获取属性?我将 User 对象的属性作为字符串:

u = User.find(1)

我可以做类似u.get("user_id")的事情

【问题讨论】:

  • 我不完全理解这个问题。你到底想做什么?
  • 如果您满意,请随时接受下面给出的答案?不符合您的需要?
  • 如果您只讨论 ActiveRecord 对象(如代码示例中所示),您可能应该在标题和问题中更明确地说明它。 (直到我尝试了答案,我才意识到这一点。)将模型视为哈希的所选答案仅适用于 ActiveRecord 对象,并且仅适用于列属性。
  • 我从这里的上下文推测你的意思是从数据存储中实际提取属性,否则使用u.user_id 或其他几种更简单的形式之一是显而易见的。

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


【解决方案1】:

您可以尝试像哈希一样使用 ActiveRecord 模型实例。

u = User.find(1)
name = u[:name]
field = "first_name"
first_name = u[field]

【讨论】:

  • +1 这是在事先不知道属性名称时的常规方法。
  • 请注意,这仅适用于列属性。它不适用于通过 attr_accessor 访问的属性。
  • 是的,假设“动态”意味着直接从数据存储中获取属性的新值,那么您必须首先从数据存储中获取对象的新副本,例如<active_record_class>.find(id),然后使用@aditya-sanghi 在此处描述的新鲜副本中的属性值。 read_attribute 方法没有命中数据库。
【解决方案2】:

另一种方法:

attr = :first_name
@user.read_attribute attr  

【讨论】:

    【解决方案3】:

    试试这个

    user = User.find(1)
    

    那么这样的事情应该可以满足您的要求

    user.send('field_name')
    

    【讨论】:

    • 使用枚举属性时,这是我发现的唯一一种将字段作为字符串而不是其原始整数值返回的方法。
    • user.public_send('field_name') 也可以工作并且更安全
    【解决方案4】:

    试试这个

    u = User.find(1)
    attr = "first_name"
    u.send(attr)
    

    【讨论】:

      【解决方案5】:

      不确定我是否完全理解您的问题。尝试类似:

      User.find(1).name
      

      如果您的意思是只想从数据库特定属性中获取,您可以这样做:

      User.find(1,:select => :name)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-19
        • 1970-01-01
        • 2018-05-12
        • 1970-01-01
        • 2012-10-27
        • 2017-05-27
        相关资源
        最近更新 更多