如何通过符号
问题描述:
分配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
当然,这种方法是不行的,我如何通过使用符号将值赋给模型列?
答
VEE的回答是一般情况下是正确的,但由于这是Rails和ActiveRecord的,你可以采取一些不错的捷径:
def load_data(data)
update_attributes data.slice(:foo, :bar:, :moo)
end
这工作,因为data.slice
将您的data
哈希过滤为给定的键,然后update_attributes
将在您的模型中设置这些值并调用#save
。当密钥不存在时,它们不会写入,因此您无需分别检查和分配每个密钥。
如果您不在意过滤入站数据并简单地分配给模型的密钥,那么只需update_attributes data
即可完成。
答
您可以使用send
:
[:foo, :bar, :moo].each do |sym|
# need some trick here
send "#{sym}=", data[sym] if data.has_key?(sym)
end