Ruby: как высушить аналогичные вызовы атрибутов модели - PullRequest
2 голосов
/ 11 февраля 2010

У меня есть модель User с рядом очень похожих свойств, которые я хочу перечислить, не вводя каждое из них по отдельности.

Итак, а не:

"eye color: #{@user.his_eye_color}"
"hair color: #{@user.his_hair_color}"
"height: #{@user.his_height}"
"weight: #{@user.his_weight}"
...

"eye color: #{@user.her_eye_color}"
"hair color: #{@user.her_hair_color}"
"height: #{@user.her_height}"
"weight: #{@user.her_weight}"
...

Я хотел бы сделать блок или что-то еще (Proc? Лямбда? Все еще неясно, что это ...):

['eye color','hair color','height','weight',...].do |stat|
   "#{stat}: #{@user.her_(stat.underscore)}"
end

['eye color','hair color','height','weight',...].do |stat|
   "#{stat}: #{@user.his_(stat.underscore)}"
end

Я знаю, что то, что я только что написал выше, является мистическим, волшебным и совершенно и НЕПРАВИЛЬНЫМ (часть @user.his_(stat.underscore)), но что я мог сделать, как это? Мне в основном нужно динамически вызывать атрибуты моей модели, но я не уверен, как это сделать ...

Любая помощь будет очень признательна!

Ответы [ 2 ]

5 голосов
/ 11 февраля 2010
['eye color','hair color','height','weight',...].do |stat|
   "#{stat}: #{ @user.send(:"her_#{stat.tr(" ","_")}") }"
end

['eye color','hair color','height','weight',...].do |stat|
   "#{stat}: #{ @user.send(:"his_#{stat.tr(" ","_")}") }"
end

Это должно работать. Вы всегда можете использовать send для вызова метода объекта и генерировать имя этого метода на лету в виде строки

2 голосов
/ 11 февраля 2010

Если вы используете ActiveRecord в Rails, вы также можете использовать метод Object # [] для динамического получения значений атрибутов

['eye color','hair color','height','weight',...].do |stat|
   "#{stat}: #{ @user[ "her_#{ stat.underscore }"]}"
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...