如何逐个分配Rails模型

时间:2014-10-10 01:15:09

标签: ruby-on-rails ruby

我有这样的方法:

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列赋值?

2 个答案:

答案 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