【问题标题】:Ruby Loop through some attributes of an objectRuby 循环遍历对象的某些属性
【发布时间】:2012-07-12 19:18:02
【问题描述】:

在 Rails 中,我有一个类名User,我只想在其中查看:name, :address, :age

我想写一段类似这样的代码:

user = User.new
[name, address, age].zip(["Name", "Address", 10]).each do |attribute, val|
  user.attribute = val
end

问题是我不知道该怎么做,因为user.attribute 显然不是有效的行。换句话说,无论如何,user.attribute 被评估为user.name、user.address、user.age 取决于循环?

【问题讨论】:

    标签: ruby-on-rails ruby attributes metaprogramming


    【解决方案1】:

    你应该使用send方法

    user.send "#{attribute}=", val
    

    如果属性是:name,那么上面的行相当于

    user.name = val
    

    【讨论】:

    • 我会使用send 作为最后的手段,Rails 提供了write_attribute(attribute, value)。
    • 哦,是的,他确实提到了rails。只是不在标签中:)
    • 再次检查:-p。可以将 send 显示为基本的元编程方法,但鉴于 OP 使用的是 rails,我们可以同时提及(以及我的回答中的另一种方式)。
    【解决方案2】:

    其实我可以这样:

    [name, address, age].zip(["Name", "Address", 10]).each do |attribute, val|
        user[attribute] = val
    end
    

    这个方法也行

    【讨论】:

      【解决方案3】:

      user.send(:name) 与调用user.name 相同,因此您可能想尝试一下。

      【讨论】:

        【解决方案4】:
        user = User.new
        [name, address, age].zip(["Name", "Address", 10]).each do |attribute, val|
          user.write_attribute(attribute, val)
        end
        

        但这就是我要写的:

        user = User.new
        user.attributes = {name => "Name", address => "Address", age => 10}
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-01-26
          • 2021-11-20
          • 2016-09-09
          • 1970-01-01
          • 2014-12-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多