2014-10-10 45 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