2014-10-10 1 views
0

에 의해 레일을 모델 열을 할당이 같은 방법이 있습니다어떻게 기호

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 컬럼에 값을 할당하려면 어떻게해야합니까?

답변

4

V 시리즈의 대답은 일반적인 경우에 대한 정확하지만이 레일 및 액티브이기 때문에, 당신은 멋진 단축키를 수행 할 수 있습니다

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

이 때문에 작동 data.slicedata 해시를 제공된 키로 필터링하고 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