2014-10-10 63 views
0

分配Rails的模型专栏中,我有一个这样的方法:如何通过符号

class Foo < ActiveRecord::Base 
    def load_data(data) 
    self.foo = data[:foo] if data.has_key?(:foo) 
    self.bar = data[:bar] if data.has_key?(:bar) 
    self.moo = data[:moo] if data.has_key?(:moo) 
    self.save 
    end 
end 

我想写这样的方法:

[:foo, :bar, :moo].each do |sym| 
    # need some trick here 
    self.sym = data[sym] if data.has_key?(sym) 
end 

当然,这种方法是不行的,我如何通过使用符号将值赋给模型列?

回答

4

VEE的回答是一般情况下是正确的,但由于这是Rails和ActiveRecord的,你可以采取一些不错的捷径:

def load_data(data) 
    update_attributes data.slice(:foo, :bar:, :moo) 
end 

这工作,因为data.slice将您的data哈希过滤为给定的键,然后update_attributes将在您的模型中设置这些值并调用#save。当密钥不存在时,它们不会写入,因此您无需分别检查和分配每个密钥。

如果您不在意过滤入站数据并简单地分配给模型的密钥,那么只需update_attributes data即可完成。

2

您可以使用send

[:foo, :bar, :moo].each do |sym| 
    # need some trick here 
    send "#{sym}=", data[sym] if data.has_key?(sym) 
end