Несколько замечаний:
1) Обязательно соблюдайте Соглашения о присвоении имен Ruby : используйте символ змеи для символов, методов и переменных (например, bodyDensityMale
должно быть body_density_male
иMidaxillary
, Tricep
и т. Д. Должны быть midaxillary
, tricep
)
2) ^
- двоичный XOR-оператор Ruby .**
для показателей.
3) В состоянии вашего контроллера имеется ошибка из-за =
против ==
.
if (@measurement.gender_type = 'Male')
должно быть
if (@measurement.gender_type == 'Male')
Первым присваивается значение, поэтому оно всегда будет истинным.==
для сравнения на равенство.
Логика вычислений лучше всего перемещать из контроллера в модель или класс обслуживания.Вот два решения для помещения его в модель Measurement
:
################################################################################
# Solution #1
################################################################################
class Measurement
MALE = 'Male'
def body_fat
(495 / body_density) - 450
end
def body_density
gender_type == MALE ? body_density_male : body_density_female
end
def body_density_male
1.112 -
(0.00043499 * body_density_sum) +
(0.00000055 * body_density_sum ** 2) -
(0.00028826 * age)
end
def body_density_female
1.097 -
(0.00046971 * body_density_sum) +
(0.00000056 * body_density_sum ** 2) -
(0.00012828 * age)
end
def body_density_sum
[chest, midaxillary, tricep, subscapular, abdominal, suprailiac, thigh].sum
end
end
################################################################################
# Solution #2 using subclasses
################################################################################
class Measurement
def body_fat
(495 / body_density) - 450
end
def body_density_sum
[chest, midaxillary, tricep, subscapular, abdominal, suprailiac, thigh].sum
end
end
class MaleMeasurement < Measurement
def body_density
1.112 -
(0.00043499 * body_density_sum) +
(0.00000055 * body_density_sum ** 2) -
(0.00028826 * age)
end
end
class FemaleMeasurement < Measurement
def body_density
1.097 -
(0.00046971 * body_density_sum) +
(0.00000056 * body_density_sum ** 2) -
(0.00012828 * age)
end
end
Чтобы использовать Solution # 2 с подклассами, вы должны были бы настроить модель Measurement
и таблицу базы данных, используя singleнаследование таблиц .Решение № 1 не потребует никаких изменений в базе данных и, вероятно, будет самым быстрым / простым (вы могли бы провести рефакторинг в будущем).
С любым из этих решений, на ваш взгляд:
<p>
<strong>Body Fat (%): </strong>
<%= @measurement.body_fat %>
</p>