2014-01-08 3 views
-1

Я создаю приложение rails, которое мне нужно обновлять итоговые суммы менеджеров каждый раз, когда кто-то добавляется. Метод, который обновляет итоговые значения для меня, выглядит очень плохо, происходит много повторений, которые могут быть решены с помощью метапрограммирования. поэтому у меня есть частный метод вызывается на before_save называется update_totalsRuby динамически строить и назначать varibles

Таким образом, мы классифицировать их, как это есть четыре расы, африканские, цветные, индийский и белый есть три вида управлений старших, средних и младших, а затем, очевидно, два вида мужчин и женщин. Мне нужно уметь назначать каждую возможную вариацию трех, поэтому я получаю что-то вроде этого.

self.number_of_african_female_senior_managers = managers.native.african.female.senior.count 
self.number_of_african_male_senior_managers = managers.native.african.male.senior.count 
self.number_of_african_female_middle_managers = managers.native.african.female.middle.count 
self.number_of_african_male_middle_managers = managers.native.african.male.middle.count 
self.number_of_african_female_junior_managers = managers.native.african.female.junior.count 
self.number_of_african_male_junior_managers = managers.native.african.male.junior.count 

Мне нужно было бы сделать это для каждой гонки. Поэтому я подумал о том, чтобы построить их динамически, а затем назначить их.

Так что-то вроде этого:

["african", "indian", "coloured", "white"].each do |race| 
    ["senior","middle","junior"].each do |management_type| 
    ["male","Female"].each do |gender| 
     "number_of_#{race}_#{gender}_#{management_type}_managers" = managers.native.race.gender.management_type.count 
    end 
    end 
end 

Но это будет возвращать строки, а не переменные, которые будут назначены. Я видел, что есть метод define_method, который может динамически создавать методы, но похоже, что вы должны вызывать его вне конструктора in this example, и я видел, что вы можете использовать Object#send, как это example, но я не могу видеть, что работаю и в этой ситуации.

Это хорошая рубиновая практика? Он добавляет немного сложности, но удаляет много СУХИХ кода.

+0

Ваш вопрос выглядит очень плохим, есть много предложений, начиная с низкого корпуса и без надлежащей связи, чтобы закончить, что можно было бы решить с некоторой осторожностью, чтобы быть уважительным для всех, кто мог бы потратить время на чтение и ответить на ваш вопрос. – sawa

+0

несколько вопросов, как и ваши: http://stackoverflow.com/questions/17842765/how-do-i-dynamically-create-a-local-variable-in-ruby ... среди прочих – AndreDurao

+0

Извините, если моя пунктуация оскорбляет вас, Сава , AndreDurao, этот вопрос не имеет для меня никакого смысла. Я собираюсь найти документацию по eval. – TheLegend

ответ

1

Это хорошая рубиновая практика?

DRY хороший рубин практика, так что ответ на ваш вопрос: ДА

Что касается вашего кода, который вы, вероятно, использовать send в такой ситуации.

что-то вроде self.send("number_of_#{race}_#{gender}_#{management_type}_managers=", managers.send(native).send(race).send(gender).send(management_type).count)

Это все еще выглядит довольно некрасиво со мной. Я как бы спрашиваю себя, почему эта структура данных настолько сумасшедшая. Почему вы не используете простую структуру хеша здесь?

+0

спасибо за ответ. Я согласен с его не очень красивым кодом. ребята, которые написали это, сделали это некоторое время назад. я думаю, его время для мега-рефакторе. – TheLegend

Смежные вопросы