我有这样的方法:
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
当然这种方法不起作用,如何使用符号为Model列赋值?
答案 0 :(得分: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
即可完成。
答案 1 :(得分:2)
您可以使用send
:
[:foo, :bar, :moo].each do |sym|
# need some trick here
send "#{sym}=", data[sym] if data.has_key?(sym)
end