2013-09-30 4 views
-1

Мои user имеет атрибут:Рубин атрибут метапрограммирования

:step1_local 
:step2_local 
:step3_local 
... 
... 
:local1 
:local2 
:local3 

Я хотел бы изменить значение атрибута на основе другого набора атрибутов на одной и той же модели. Я хотел бы сделать некоторое отображение обработки на user, говорят:

def magic (user) 
    user.local(1..3) = process(user.step(1..3)_local) 
end 

Код выше, конечно, не работает (например). Я не уверен, как это сделать динамически, не пропуская каждый атрибут по отдельности. Я хочу сопоставить обработку друг с другом. Есть идеи?

ответ

2

Вы можете использовать Object#public_send и способ, как это:

def magic(user) 
    (1..3).each do |n| 
    user.public_send("local#{n}=", process(user.read_attribute("step#{n}_local"))) 
    end 
end 
Смежные вопросы